Python?JSON模塊loads、load、dump、dumps函數(shù)舉例詳解
1 函數(shù)介紹
| 函數(shù)名稱 | 函數(shù)描述 |
|---|---|
| json.load() | 用于從文件對(duì)象中讀取 JSON 數(shù)據(jù),并將其解析為 Python 對(duì)象。 |
| json.loads() | 用于將JSON 格式的字符串解析為 Python 對(duì)象 |
| json.dump() | 用于將 Python 對(duì)象序列化為 JSON 格式,并將其寫入文件。 |
| json.dumps() | 用于將 Python 對(duì)象序列化為JSON 格式的字符串。 |
2 json.load()
json.load()是Python中json模塊提供的一個(gè)函數(shù),用于從文件對(duì)象中讀取JSON數(shù)據(jù),并將其解析為Python對(duì)象。
2.1 語(yǔ)法格式
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
參數(shù)說(shuō)明:
fp:一個(gè)包含要執(zhí)行反序列化的 JSON 文檔的支持.read()的 text file 或 binary file。cls:如果設(shè)定此參數(shù),則使用自定義的JSON解碼器。任何傳遞給load()方法的多余關(guān)鍵字參數(shù)都會(huì)被傳遞給cls的構(gòu)造器。如果傳入None(默認(rèn)值),則會(huì)使用JSONDecoder。object_hook:可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以任意被解碼的對(duì)象字面值(即一個(gè)dict)作為參數(shù)的函數(shù)。該函數(shù)的返回值將代替該dict使用。此特性可被用于實(shí)現(xiàn)自定義解碼器,例如JSON-RPC類提示。默認(rèn)值為None。parse_float:可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以代表每個(gè)要解碼的JSON浮點(diǎn)數(shù)的字符串作為參數(shù)的函數(shù)。如為None(默認(rèn)值),則它等價(jià)于float(num_str)。這可被用于將JSON浮點(diǎn)數(shù)解析為自定義數(shù)據(jù)類型,例如decimal.Decimal。parse_int:可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以代表每個(gè)要解碼的JSON整數(shù)的字符串作為參數(shù)的函數(shù)。如為None(默認(rèn)值),則它等價(jià)于int(num_str)。這可被用于將JSON整數(shù)解析為自定義數(shù)據(jù)類型,例如float。parse_constant:可選函數(shù),如果設(shè)置,將是一個(gè)以下列字符串之一作為參數(shù)的函數(shù):-Infinity,Infinity或NaN。 這可被用于在遇到無(wú)效的 JSON 數(shù)字時(shí)引發(fā)異常。 默認(rèn)值為 None。object_pairs_hook:可選函數(shù),如果設(shè)置,將是一個(gè)在調(diào)用時(shí)以對(duì)照值的有序列表進(jìn)行解碼的任意對(duì)象字面值作為參數(shù)的函數(shù)。該函數(shù)的返回值將代替該dict使用。此特性可被用于實(shí)現(xiàn)自定義解碼器。如果還設(shè)置了object_hook,則object_pairs_hook的優(yōu)先級(jí)更高,默認(rèn)值為None。
2.2 異常說(shuō)明
JSONDecodeError: 當(dāng)被反序列化的數(shù)據(jù)不是合法的JSON文檔。UnicodeDecodeError: 當(dāng)被反序列化的數(shù)據(jù)不包含UTF-8,UTF-16或UTF-32編碼的數(shù)據(jù)。
2.3 返回值說(shuō)明
json.load()返回一個(gè)Python對(duì)象,具體類型取決于JSON文件的內(nèi)容:
JSON對(duì)象
({})會(huì)被解析為Python的dict。
JSON數(shù)組([])會(huì)被解析為Python的list。
JSON字符串("...")會(huì)被解析為Python的str。
JSON數(shù)字(123或12.3)會(huì)被解析為Python的int或float。
JSON的true、false和null會(huì)被解析為Python的True、False和None。
2.4 注意事項(xiàng)
文件編碼:在打開(kāi)文件時(shí),確保指定正確的編碼(如utf-8),否則可能會(huì)因編碼問(wèn)題導(dǎo)致解析失敗。文件路徑:確保文件路徑正確,否則會(huì)拋出FileNotFoundError異常。JSON格式必須正確:如果JSON文件格式不正確(如缺少引號(hào)、括號(hào)不匹配等),會(huì)拋出json.JSONDecodeError異常。性能問(wèn)題:對(duì)于非常大的JSON文件,json.load()會(huì)將整個(gè)文件加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式解析工具(如ijson)。
2.5 示例
2.5.1 示例數(shù)據(jù)
data.json文件內(nèi)容如下:
{
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}
2.5.2 基本用法
import json
# 打開(kāi)文件并讀取JSON數(shù)據(jù)
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data) # {'name': '辰南', 'age': 10028, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data)) # <class 'dict'>
2.5.3 自定義解析
import json
def custom_parse_float(value):
"""
自定義浮點(diǎn)數(shù)解析函數(shù)
:param value:傳入浮點(diǎn)數(shù)
:return:返回保留一位小數(shù)的值
"""
return round(float(value), 1) # 保留一位小數(shù)
# 打開(kāi)文件并讀取 JSON 數(shù)據(jù)
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f, parse_float=custom_parse_float)
print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}3 json.loads()
json.loads()是Python中json模塊提供的一個(gè)函數(shù),用于將JSON格式的字符串解析為Python對(duì)象。JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于數(shù)據(jù)傳輸和配置文件。
3.1 語(yǔ)法格式
json.loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
類似于load(),但不是針對(duì)文件型對(duì)象,而是使用這個(gè)轉(zhuǎn)換表將s(一個(gè)包含JSON的str,bytes或bytearray實(shí)例)反序列化為Python對(duì)象。
3.2 返回值說(shuō)明
json.loads()返回一個(gè)Python對(duì)象,具體類型取決于JSON文件的內(nèi)容:
JSON對(duì)象
({})會(huì)被解析為Python的dict。
JSON數(shù)組([])會(huì)被解析為Python的list。
JSON字符串("...")會(huì)被解析為Python的str。
JSON數(shù)字(123或12.3)會(huì)被解析為Python的int或float。
JSON的true、false和null會(huì)被解析為Python的True、False和None。
3.3 注意事項(xiàng)
JSON字符串必須符合格式:如果JSON字符串格式不正確(如缺少引號(hào)、括號(hào)不匹配等),會(huì)拋出json.JSONDecodeError異常。性能問(wèn)題:對(duì)于非常大的JSON數(shù)據(jù),建議使用json.load()從文件流中讀取,而不是一次性加載到內(nèi)存中。
3.4 示例
3.4.1 基本用法
import json
# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.3, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}'
# 解析為 Python 字典
data = json.loads(json_str)
print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data)) # <class 'dict'>
3.4.2 自定義解析
import json
# JSON 格式的字符串
json_str = '{"name": "辰南", "age": 10028.26, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}'
# 自定義浮點(diǎn)數(shù)解析函數(shù)
def custom_parse_float(value):
"""
自定義浮點(diǎn)數(shù)解析函數(shù)
:param value:傳入浮點(diǎn)數(shù)
:return:返回保留一位小數(shù)的值
"""
return round(float(value), 1) # 保留一位小數(shù)
# 解析 JSON 字符串
data = json.loads(json_str, parse_float=custom_parse_float)
print(data) # {'name': '辰南', 'age': 10028.3, 'skill': ['喚魔經(jīng)', '太上忘情錄', '通天動(dòng)地魔功']}
print(type(data)) # <class 'dict'>
3.4.3 網(wǎng)絡(luò)請(qǐng)求
import requests
import json
# 字典類型的表單參數(shù)
data = {'辰南': '從神墓爬出來(lái)',
'楚月': '辰南老婆之一'}
# 發(fā)送網(wǎng)絡(luò)請(qǐng)求
res = requests.post('http://httpbin.org/post', data=data)
res_dict = json.loads(res.text) # 將響應(yīng)數(shù)據(jù)轉(zhuǎn)換為字典類型
print(res_dict)
print(type(res_dict))
4 json.dump()
json.dump()是Python中json模塊提供的一個(gè)函數(shù),用于將Python對(duì)象序列化為JSON格式,并將其寫入文件。與json.dumps()不同,json.dump()直接將數(shù)據(jù)寫入文件對(duì)象,而不是返回一個(gè)字符串。
4.1 語(yǔ)法格式
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
參數(shù)說(shuō)明:
obj:要序列化的Python對(duì)象。fp:文件型對(duì)象obj將為序列化輸出的目標(biāo)。json模塊總是產(chǎn)生str對(duì)象,而不是bytes對(duì)象,因此fp.write()必須支持str輸入。skipkeys:如為True,則不為基本類型(str,int,float,bool,None)的鍵將被跳過(guò)而不會(huì)引發(fā)TypeError。默認(rèn)為False。ensure_ascii:如為True(默認(rèn)值),則輸出將保證對(duì)所有輸入的非ASCII字符進(jìn)行轉(zhuǎn)義。如為False,這些字符將被原樣輸出。check_circular:如為False,則對(duì)容器類型的循環(huán)引用檢查會(huì)被跳過(guò)并且循環(huán)引用將導(dǎo)致RecursionError(或更糟的情況)。默認(rèn)為True。allow_nan:如為False,則對(duì)超范圍的float值(nan,inf,-inf)進(jìn)行序列化將導(dǎo)致ValueError,以嚴(yán)格遵循JSON規(guī)范。如為True(默認(rèn)值),則將使用它們的JavaScript等價(jià)形式(NaN,Infinity,-Infinity)。cls:如果設(shè)置,則重寫為一個(gè)帶有default()方法的自定義JSON編碼器,用以序列化為自定義的數(shù)據(jù)類型。如為None(默認(rèn)值),則使用JSONEncoder。indent:如為一個(gè)正整數(shù)或字符串,JSON數(shù)組元素和對(duì)象成員將按其所指定的縮進(jìn)層級(jí)美化打印。正整數(shù)表示每級(jí)縮進(jìn)指定數(shù)量的空格;字符串(如"\t")則被用于每級(jí)縮進(jìn)。如為零、負(fù)數(shù)或""(空字符串),則僅插入換行符。如為None(默認(rèn)值),則使用最緊湊表示形式。separators:一個(gè)二元組:(item_separator,key_separator)。如為None(默認(rèn)值),則默認(rèn)當(dāng)indent為None時(shí)separators為(',',':'),否則為(',',':')。要使用最緊湊形式的JSON,可指定(‘,’,‘:’)來(lái)去除空格。default:當(dāng)對(duì)象無(wú)法被序列化時(shí)將被調(diào)用的函數(shù)。它應(yīng)該返回一個(gè)可被JSON編碼的版本或是引發(fā)TypeError。如為None(默認(rèn)值),則會(huì)引發(fā)TypeError。sort_keys:如為True,則字典輸出將按鍵排序。默認(rèn)為False。
4.2 返回值說(shuō)明
json.dump() 沒(méi)有返回值,它會(huì)將序列化后的 JSON 數(shù)據(jù)直接寫入文件。
4.3 注意事項(xiàng)
文件模式:在打開(kāi)文件時(shí),確保使用寫入模式(如'w'),否則會(huì)拋出錯(cuò)誤。非字符串鍵:如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError。可以通過(guò)設(shè)置skipkeys=True跳過(guò)這些鍵。特殊值:默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。性能問(wèn)題:對(duì)于非常大的數(shù)據(jù),json.dump()會(huì)將整個(gè)對(duì)象加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式寫入工具。
4.4 示例
4.4.1 基本用法
import json
# Python 字典
data = {
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}
# 打開(kāi)文件并寫入 JSON 數(shù)據(jù)
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f)
4.4.2 自定義化序列
如果 Python 對(duì)象中包含無(wú)法直接序列化的類型(如 datetime),可以使用default參數(shù)指定一個(gè)處理函數(shù):
import json
from datetime import datetime
def custom_serializer(obj):
"""
自定義序列化函數(shù)
:param obj:
:return:
"""
# 判斷數(shù)據(jù)是否為日期
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S') # 將 datetime 轉(zhuǎn)換為字符串
raise TypeError("Type not serializable")
# Python 字典,包含 datetime 對(duì)象
data = {
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"],
"created": datetime.now()
}
# 打開(kāi)文件并寫入 JSON 數(shù)據(jù)
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, default=custom_serializer, indent=4, ensure_ascii=False)5 json.dumps()
json.dumps()是Python中json模塊提供的一個(gè)函數(shù),用于將Python對(duì)象序列化為JSON格式的字符串。與json.dump()不同,json.dumps()返回一個(gè)字符串,而不是直接寫入文件。
5.1 語(yǔ)法格式
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
使用這個(gè)轉(zhuǎn)換表將obj序列化為JSON格式的str。其參數(shù)的含義與dump()中的相同。
5.2 返回值說(shuō)明
json.dumps() 返回一個(gè) JSON 格式的字符串。
5.3 注意事項(xiàng)
非字符串鍵:如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError??梢酝ㄟ^(guò)設(shè)置skipkeys=True跳過(guò)這些鍵。特殊值:默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。編碼問(wèn)題:如果ensure_ascii=True(默認(rèn)),所有非ASCII字符會(huì)被轉(zhuǎn)義為\uXXXX格式。如果希望保留原始字符,可以設(shè)置ensure_ascii=False。性能問(wèn)題:對(duì)于非常大的數(shù)據(jù),json.dumps()會(huì)將整個(gè)對(duì)象加載到內(nèi)存中。如果內(nèi)存有限,可以考慮使用流式處理工具。
5.4 示例
5.4.1 基本用法
import json
# Python 字典
data = {
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}
# 序列化為 JSON 字符串
json_str = json.dumps(data,ensure_ascii=False)
print(json_str) # {"name": "辰南", "age": 10028.26, "skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]}
5.4.2 自定義序列化
如果 Python 對(duì)象中包含無(wú)法直接序列化的類型(如 datetime),可以使用default參數(shù)指定一個(gè)處理函數(shù):
import json
from datetime import datetime
def custom_serializer(obj):
"""
自定義序列化函數(shù)
:param obj:
:return:
"""
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S') # 將 datetime 轉(zhuǎn)換為字符串
raise TypeError("Type not serializable")
# Python 字典,包含 datetime 對(duì)象
data = {
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"],
"created": datetime.now()
}
# 序列化為 JSON 字符串,indent:美化,ensure_ascii:輸出中文,sort_keys:排序
json_str = json.dumps(data, default=custom_serializer, indent=4, ensure_ascii=False, sort_keys=True)
print(json_str)總結(jié)
到此這篇關(guān)于Python JSON模塊loads、load、dump、dumps函數(shù)的文章就介紹到這了,更多相關(guān)Python JSON模塊loads、load、dump、dumps內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Scrapy保存控制臺(tái)信息到文本解析
這篇文章主要介紹了Python使用Scrapy保存控制臺(tái)信息到文本解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
解決Python中回文數(shù)和質(zhì)數(shù)的問(wèn)題
今天小編就為大家分享一篇解決Python中回文數(shù)和質(zhì)數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
使用python爬蟲(chóng)獲取黃金價(jià)格的核心代碼
這篇文章主要介紹了利用python爬蟲(chóng)獲取黃金價(jià)格,需要的朋友可以參考下2018-06-06
python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python中的jquery PyQuery庫(kù)使用小結(jié)
這篇文章主要介紹了Python中的jquery PyQuery庫(kù)使用小結(jié),需要的朋友可以參考下2014-05-05
python爬蟲(chóng)實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊
Python爬蟲(chóng)常常會(huì)面臨自己ip地址被封的情況,也許不懂的讀者就只能等ip解封之后再進(jìn)行接下來(lái)的操作了,為什么自己不做一個(gè)Python模塊專門用于處理這種情況呢?文中對(duì)于讀者開(kāi)發(fā)Python爬蟲(chóng)肯定有一定的幫助,希望讀者耐心看下去,需要的朋友可以參考下2021-06-06

