Python?JSON模塊loads、load、dump、dumps函數(shù)舉例詳解
1 函數(shù)介紹
| 函數(shù)名稱(chēng) | 函數(shù)描述 |
|---|---|
| json.load() | 用于從文件對(duì)象中讀取 JSON 數(shù)據(jù),并將其解析為 Python 對(duì)象。 |
| json.loads() | 用于將JSON 格式的字符串解析為 Python 對(duì)象 |
| json.dump() | 用于將 Python 對(duì)象序列化為 JSON 格式,并將其寫(xiě)入文件。 |
| 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類(lèi)提示。默認(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ù)類(lèi)型,例如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ù)類(lèi)型,例如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ì)象,具體類(lèi)型取決于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)
類(lèi)似于load(),但不是針對(duì)文件型對(duì)象,而是使用這個(gè)轉(zhuǎn)換表將s(一個(gè)包含JSON的str,bytes或bytearray實(shí)例)反序列化為Python對(duì)象。
3.2 返回值說(shuō)明
json.loads()返回一個(gè)Python對(duì)象,具體類(lèi)型取決于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
# 字典類(lèi)型的表單參數(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)換為字典類(lèi)型
print(res_dict)
print(type(res_dict))
4 json.dump()
json.dump()是Python中json模塊提供的一個(gè)函數(shù),用于將Python對(duì)象序列化為JSON格式,并將其寫(xiě)入文件。與json.dumps()不同,json.dump()直接將數(shù)據(jù)寫(xiě)入文件對(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:如為T(mén)rue,則不為基本類(lèi)型(str,int,float,bool,None)的鍵將被跳過(guò)而不會(huì)引發(fā)TypeError。默認(rèn)為False。ensure_ascii:如為T(mén)rue(默認(rèn)值),則輸出將保證對(duì)所有輸入的非ASCII字符進(jìn)行轉(zhuǎn)義。如為False,這些字符將被原樣輸出。check_circular:如為False,則對(duì)容器類(lèi)型的循環(huán)引用檢查會(huì)被跳過(guò)并且循環(huán)引用將導(dǎo)致RecursionError(或更糟的情況)。默認(rèn)為T(mén)rue。allow_nan:如為False,則對(duì)超范圍的float值(nan,inf,-inf)進(jìn)行序列化將導(dǎo)致ValueError,以嚴(yán)格遵循JSON規(guī)范。如為T(mén)rue(默認(rèn)值),則將使用它們的JavaScript等價(jià)形式(NaN,Infinity,-Infinity)。cls:如果設(shè)置,則重寫(xiě)為一個(gè)帶有default()方法的自定義JSON編碼器,用以序列化為自定義的數(shù)據(jù)類(lèi)型。如為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:如為T(mén)rue,則字典輸出將按鍵排序。默認(rèn)為False。
4.2 返回值說(shuō)明
json.dump() 沒(méi)有返回值,它會(huì)將序列化后的 JSON 數(shù)據(jù)直接寫(xiě)入文件。
4.3 注意事項(xiàng)
文件模式:在打開(kāi)文件時(shí),確保使用寫(xiě)入模式(如'w'),否則會(huì)拋出錯(cuò)誤。非字符串鍵:如果字典的鍵不是字符串類(lèi)型,默認(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)存有限,可以考慮使用流式寫(xiě)入工具。
4.4 示例
4.4.1 基本用法
import json
# Python 字典
data = {
"name": "辰南",
"age": 10028.26,
"skill": ["喚魔經(jīng)", "太上忘情錄", "通天動(dòng)地魔功"]
}
# 打開(kāi)文件并寫(xiě)入 JSON 數(shù)據(jù)
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f)
4.4.2 自定義化序列
如果 Python 對(duì)象中包含無(wú)法直接序列化的類(lèi)型(如 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)文件并寫(xiě)入 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è)字符串,而不是直接寫(xiě)入文件。
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)
非字符串鍵:如果字典的鍵不是字符串類(lèi)型,默認(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ú)法直接序列化的類(lèi)型(如 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中高級(jí)文本模式匹配與查找技術(shù)指南
文本處理是編程世界的永恒主題,而模式匹配則是文本處理的基石,本文將深度剖析Python Cookbook中的核心匹配技術(shù),并結(jié)合實(shí)際工程案例展示其應(yīng)用,希望對(duì)大家有所幫助2025-08-08
Django框架創(chuàng)建項(xiàng)目的方法入門(mén)教程
這篇文章主要介紹了Django框架創(chuàng)建項(xiàng)目的方法,結(jié)合實(shí)例形式分析了Django框架管理工具的使用及創(chuàng)建項(xiàng)目的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
python實(shí)戰(zhàn)練習(xí)之最新男女顏值打分小系統(tǒng)
前幾天不是出過(guò)一期Python美顏相機(jī)嘛?不知道大家現(xiàn)在還記不記得?這一期的話題還是緊接著那一期顏值方面來(lái)走,對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09
Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決
這篇文章主要介紹了Jupyter Notebook/VSCode導(dǎo)出PDF中文不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python實(shí)現(xiàn)定時(shí)監(jiān)測(cè)網(wǎng)站運(yùn)行狀態(tài)的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)定時(shí)監(jiān)測(cè)網(wǎng)站狀態(tài)的示例代碼,幫助大家更好的管理自己的網(wǎng)站,感興趣的朋友可以了解下2020-09-09
詳解分布式任務(wù)隊(duì)列Celery使用說(shuō)明
這篇文章主要介紹了詳解分布式任務(wù)隊(duì)列Celery使用說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
使用python3調(diào)用wxpy模塊監(jiān)控linux日志并定時(shí)發(fā)送消息給群組或好友
這篇文章主要介紹了使用python3調(diào)用wxpy模塊,監(jiān)控linux日志并定時(shí)發(fā)送消息給群組或好友,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
python Selenium等待元素出現(xiàn)的具體方法
在本篇文章里小編給大家分享的是一篇關(guān)于python Selenium等待元素出現(xiàn)的具體方法,以后需要的朋友們可以學(xué)習(xí)參考下。2021-08-08
python實(shí)現(xiàn)0到1之間的隨機(jī)數(shù)方式
這篇文章主要介紹了python實(shí)現(xiàn)0到1之間的隨機(jī)數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

