介紹
當(dāng)處理 JSON 數(shù)據(jù)時,Python 中的 json 模塊提供了四個主要的函數(shù):dump、dumps、load 和 loads。這些函數(shù)提供了在 JSON 數(shù)據(jù)和 Python 對象之間進(jìn)行轉(zhuǎn)換和序列化的功能。
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,廣泛用于將數(shù)據(jù)從一個應(yīng)用程序傳輸?shù)搅硪粋€應(yīng)用程序。它基于 JavaScript 語言的一個子集,但已成為跨編程語言和平臺的通用數(shù)據(jù)格式。
JSON 數(shù)據(jù)由鍵值對組成,類似于 Python 中的字典或 JavaScript 中的對象。它支持以下數(shù)據(jù)類型:
- 字符串(String):表示文本數(shù)據(jù),使用雙引號括起來。
- 數(shù)字(Number):表示整數(shù)或浮點(diǎn)數(shù)。
- 布爾值(Boolean):表示真或假。
- 數(shù)組(Array):表示有序的值列表,使用方括號括起來,值之間用逗號分隔。
- 對象(Object):表示鍵值對集合,使用花括號括起來,鍵和值之間用冒號分隔,鍵值對之間用逗號分隔。
常用 API
-
**loads() **:將 JSON 字符串解析為 Python 對象。
注意:
- 在使用 loads 的時候 json 中的字符串必須要用雙引號,否則會報(bào)錯(json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 12))
- 入?yún)⒉荒転?None,否則報(bào)錯
-
dumps() : 將 Python 對象轉(zhuǎn)換為為 JSON 字符串
參數(shù):
-
obj(必需):要編碼為 JSON 格式的 Python 數(shù)據(jù)結(jié)構(gòu)。這可以是字典、列表、整數(shù)、字符串等等。
-
ensure_ascii(可選):默認(rèn)為 True。
- 如果將其設(shè)置為 True,則會確保生成的 JSON 字符串中的所有非 ASCII 字符都會被轉(zhuǎn)義為 Unicode 轉(zhuǎn)義序列(例如 \uXXXX),以便在輸出時保持 ASCII 字符集。
- 如果將其設(shè)置為 False,則非 ASCII 字符將以原始形式保留在輸出中。
-
indent(可選):用于指定生成的 JSON 字符串的縮進(jìn)級別。如果設(shè)置為一個整數(shù),將在生成的 JSON 字符串中包含縮進(jìn),使其更易于閱讀。
-
skipkeys(可選):默認(rèn)為 False。如果將其設(shè)置為 True,則會跳過那些字典鍵不是基本數(shù)據(jù)類型(str, int, float, bool, NoneType)的項(xiàng)。如果字典中包含非基本數(shù)據(jù)類型的鍵,將會引發(fā) TypeError。
-
check_circular(可選):默認(rèn)為 True。
- 如果將其設(shè)置為 True,則會檢查循環(huán)引用并引發(fā) ValueError。
- 如果將其設(shè)置為 False,則不會檢查循環(huán)引用。
-
allow_nan(可選):默認(rèn)為 True。
- 如果將其設(shè)置為 True,則允許編碼浮點(diǎn)數(shù)值為特殊值(如 NaN 和 Infinity),這符合 JSON 規(guī)范。
- 如果將其設(shè)置為 False,則將 NaN 和 Infinity 視為無效輸入,并引發(fā) ValueError。
-
cls(可選):用于指定自定義 JSON 編碼器的類。默認(rèn)為 None,表示使用標(biāo)準(zhǔn)的 JSON 編碼器。
-
separators(可選):用于指定生成的 JSON 字符串中的分隔符。
默認(rèn)為 (
", "
,": "
),表示鍵值對之間使用逗號和冒號分隔??梢愿鶕?jù)需要自定義分隔符。
import json str = ''' [{ "name":"AnJing", "age":"26" }] ''' data = json.loads(str) print(data) # 輸出:[{'name': 'AnJing', 'age': '26'}] print(type(data)) # 輸出:<class 'list'> print(data[0].get('name')) # 輸出:AnJing print(data[0]['name']) # 通過下標(biāo)進(jìn)行選擇 str_data = json.dumps(data) print(type(data)) # 輸出:<class 'str'> print(data) # 輸出:[{"name": "AnJing", "age": "26"}]
-
-
load() :從 JSON 文件中讀取數(shù)據(jù),并將其解析為 Python 對象。
它接受一個參數(shù):要讀取的文件對象。
-
dump() :將 Python 對象轉(zhuǎn)換為 JSON 數(shù)據(jù),并將其寫入文件對象中
它接受兩個參數(shù):要序列化的對象和目標(biāo)文件對象
注意:在使用 dump 和 load 函數(shù)時,需要提供文件對象并確保文件以適當(dāng)?shù)哪J酱蜷_(如 ‘w’ 用于寫入,‘r’ 用于讀?。?/strong>
import json str = [{ "name":"AnJing", "age":"26" }] # 通過dump寫入到文件中 json.dump(str, open('123.json','w')) # 通過load查看是否寫入 data = json.load(open('123.json','r')) print(data) # 輸出:[{'name': 'AnJing', 'age': '26'}]
常見報(bào)錯
-
解析無效的 JSON 字符串
如果提供的 JSON 數(shù)據(jù)無效,解析過程將引發(fā) JSONDecodeError 異常。
例如:
-
缺少引號
invalid_json = '{"name": "ZhangSan", age: 30, "city": "ShenZhen"}' data = json.loads(invalid_json) # 引發(fā)JSONDecodeError異常。原因?yàn)镴SON字符串中的age缺少雙引號,導(dǎo)致解析失敗
-
不符合 JSON 語法規(guī)則(JSON 數(shù)據(jù)內(nèi)字符串必須使用雙引號)
-
-
解析無效屬性的字符串
如果方法入?yún)?None 或空字符串燈,解析過程將引發(fā) AttributeError 錯誤
-
訪問不存在的鍵
如果嘗試訪問 JSON 數(shù)據(jù)中不存在的鍵,將引發(fā) KeyError 異常。
print(data['address']) # 引發(fā)KeyError異常。原因?yàn)镴SON數(shù)據(jù)中沒有address鍵,訪問該鍵將引發(fā)異常
獲取對象去除為 null 的字段的 json 字符串
-
要將一個包含基本模型的對象轉(zhuǎn)換為 JSON 并去除其中的
null
字段,可以使用 Python 中的json
模塊和一個遞歸函數(shù)來完成這個任務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-752041.html -
示例代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-752041.html
import json def remove_null(obj): if isinstance(obj, dict): return {key: remove_null(value) for key, value in obj.items() if value is not None} elif isinstance(obj, list): return [remove_null(item) for item in obj if item is not None] else: return obj # 示例對象,包含了一些 None 值 data = { "name": "John", "age": None, "address": { "street": "123 Main St", "city": None, "zip_code": "98765" }, "hobbies": ["reading", None, "swimming"] } # 使用 remove_null 函數(shù)去除 None 值 data_without_null: dict = remove_null(data) # 將處理后的對象轉(zhuǎn)換為 JSON 格式 json_data = json.dumps(data_without_null) # 注意:繼承自pydantic的BaseModel類的類,若有字段的類型也是BaseModel,需先轉(zhuǎn)json再轉(zhuǎn)dict,再傳入函數(shù) json_data = json.dumps(remove_null(json.loads(base_model.josn())))
到了這里,關(guān)于python 常用內(nèi)置模塊之 json的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!