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 語法格式
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
參數(shù)說明:
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
。 這可被用于在遇到無效的 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 異常說明
JSONDecodeError:
當(dāng)被反序列化的數(shù)據(jù)不是合法的JSON文檔。UnicodeDecodeError:
當(dāng)被反序列化的數(shù)據(jù)不包含UTF-8
,UTF-16
或UTF-32
編碼的數(shù)據(jù)。
2.3 返回值說明
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)
文件編碼:
在打開文件時(shí),確保指定正確的編碼(如utf-8
),否則可能會(huì)因編碼問題導(dǎo)致解析失敗。文件路徑:
確保文件路徑正確,否則會(huì)拋出FileNotFoundError
異常。JSON格式必須正確:
如果JSON文件格式不正確(如缺少引號(hào)、括號(hào)不匹配等),會(huì)拋出json.JSONDecodeError
異常。性能問題:
對(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 # 打開文件并讀取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ù) # 打開文件并讀取 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 語法格式
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 返回值說明
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異常。性能問題:
對(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 = {'辰南': '從神墓爬出來', '楚月': '辰南老婆之一'} # 發(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 語法格式
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ù)說明:
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)
的鍵將被跳過而不會(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ì)被跳過并且循環(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,可指定(‘,’,‘:’)來去除空格。default:
當(dāng)對(duì)象無法被序列化時(shí)將被調(diào)用的函數(shù)。它應(yīng)該返回一個(gè)可被JSON編碼的版本或是引發(fā)TypeError。如為None(默認(rèn)值),則會(huì)引發(fā)TypeError。sort_keys:
如為True,則字典輸出將按鍵排序。默認(rèn)為False。
4.2 返回值說明
json.dump() 沒有返回值,它會(huì)將序列化后的 JSON 數(shù)據(jù)直接寫入文件。
4.3 注意事項(xiàng)
文件模式:
在打開文件時(shí),確保使用寫入模式(如'w')
,否則會(huì)拋出錯(cuò)誤。非字符串鍵:
如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError??梢酝ㄟ^設(shè)置skipkeys=True
跳過這些鍵。特殊值:
默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。
性能問題:
對(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)地魔功"] } # 打開文件并寫入 JSON 數(shù)據(jù) with open('output.json', 'w', encoding='utf-8') as f: json.dump(data, f)
4.4.2 自定義化序列
如果 Python 對(duì)象中包含無法直接序列化的類型(如 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() } # 打開文件并寫入 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 語法格式
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 返回值說明
json.dumps() 返回一個(gè) JSON 格式的字符串。
5.3 注意事項(xiàng)
非字符串鍵:
如果字典的鍵不是字符串類型,默認(rèn)會(huì)拋出TypeError??梢酝ㄟ^設(shè)置skipkeys=True
跳過這些鍵。特殊值:
默認(rèn)情況下,NaN、Infinity等特殊值可以被序列化。如果不需要,可以設(shè)置allow_nan=False。
編碼問題:
如果ensure_ascii=True
(默認(rèn)),所有非ASCII字符會(huì)被轉(zhuǎn)義為\uXXXX格式。
如果希望保留原始字符,可以設(shè)置ensure_ascii=False。
性能問題:
對(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ì)象中包含無法直接序列化的類型(如 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ù)的問題
今天小編就為大家分享一篇解決Python中回文數(shù)和質(zhì)數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于使用Scrapy爬取動(dòng)態(tài)數(shù)據(jù)的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例
今天小編就為大家分享一篇python 實(shí)現(xiàn)一個(gè)反向單位矩陣示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python中的jquery PyQuery庫使用小結(jié)
這篇文章主要介紹了Python中的jquery PyQuery庫使用小結(jié),需要的朋友可以參考下2014-05-05python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊
Python爬蟲常常會(huì)面臨自己ip地址被封的情況,也許不懂的讀者就只能等ip解封之后再進(jìn)行接下來的操作了,為什么自己不做一個(gè)Python模塊專門用于處理這種情況呢?文中對(duì)于讀者開發(fā)Python爬蟲肯定有一定的幫助,希望讀者耐心看下去,需要的朋友可以參考下2021-06-06