json簡介
json(javascript object notation) 是一種輕量級的數(shù)據(jù)交換格式,python3中可以使用json模塊來對json數(shù)據(jù)進(jìn)行編解碼
該模塊主要提供了四種方法:
- dumps
- dump
- loads
- load
dumps 和dump 對python對象進(jìn)行序列化,將一個(gè)python對象進(jìn)行json格式的編碼
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)
- obj:表示要序列化的對象
- fp:文件描述符,將序列化的str保存到文件中,json模塊總是生成str對象,而不是字節(jié)對象,因此fp.write()必須支持str輸入
- skipkey: 默認(rèn)為False,如果skipkeys為True(默認(rèn)值為False),則將跳過不是基本類型(str, int, float, bool, Nose)的dict鍵,不會(huì)引發(fā)TypeError
- ensure_ascii: 默認(rèn)值為True, 能將所有傳入的非ASCII字符轉(zhuǎn)移輸出,如果ensure_ascii為False,則這些字符將按原樣輸出
- check_circular:默認(rèn)值為True,如果check_circular為False,則將跳過對容器類型的循環(huán)引用檢查,循環(huán)引用將導(dǎo)致OverflowError
- allow_nan: 默認(rèn)值為True,如果allow_nan為Flase, 則嚴(yán)格遵守Json規(guī)范,序列化超出范圍的浮點(diǎn)值(nan, inf, -inf)會(huì)引發(fā)ValueError,
如果allow_nan為True,則將使用它們的JavaScript等銷項(xiàng)(NaN,Infinity, -Infinity) - Indent: 設(shè)置縮進(jìn)格式,默認(rèn)值為None,選擇的是最緊湊的表示,如果Indent是非負(fù)整數(shù)或者字符串, 那么json數(shù)組元素對象和成員將
使用該縮進(jìn)級別進(jìn)行輸入;如果Indent為0、負(fù)數(shù)或者“”,則僅插入換行符;indent使用正整數(shù)縮進(jìn)多個(gè)空格;如果indent是一個(gè)字符串(如“\t”)則該字符串用于縮進(jìn)每個(gè)級別 - separators: 去除分隔符后面的空格,默認(rèn)值為None,如果指定,則分隔符應(yīng)為(item_separator, key_separator)元組,如果縮進(jìn)為None,則默認(rèn)為(',', ':');要獲得最緊湊的json表示,則可以指定(',',':')以消除空格
- default: 默認(rèn)值為None, 如果指定,則default應(yīng)該是為無法以其他方式序列化的對象調(diào)用的函數(shù),它應(yīng)返回對象的json可編碼版本
或引發(fā)TypeError,如果未指定,則引發(fā)TypeError - sort_keys: 默認(rèn)值為False,如果sort_keys為True,則字典的輸出將按照鍵值排序
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)
dumps函數(shù)不需要傳文件描述符,其他參數(shù)與dump函數(shù)的一樣
laod 和 loads 反序列化方法, 將json格式數(shù)據(jù)解碼為python對象
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- fp: 文件描述符,將fp反序列化為python對象
- object_hook: 默認(rèn)值為None, object_hook是一個(gè)可選函數(shù),此功能可用于實(shí)現(xiàn)自定義解碼器,指定一個(gè)函數(shù),該函數(shù)負(fù)責(zé)把反序列化后的基本類型對象轉(zhuǎn)換成自定義類型的對象
- parse_float: 默認(rèn)值為None,如果指定了parse_float, 用來對json float字符串進(jìn)行解碼,這可用于為json浮點(diǎn)數(shù)使用另一種數(shù)據(jù)類型或解析器
- parse_int: 默認(rèn)值為None,如果指定了parse_int, 用來對json int 字符串進(jìn)行解碼,這可以用于為json整數(shù)使用另一種數(shù)據(jù)類型或解析器
- parse_constant:默認(rèn)值為None,如果指定了parse_constant,對-Infnity, Infinity,NaN字符串進(jìn)行調(diào)用,如果遇到了無效的json符號,會(huì)引發(fā)異常,如果進(jìn)行反序列化(解碼)的數(shù)據(jù)不是一個(gè)有效的json文檔,將會(huì)引發(fā)jsondecodeerror異常
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
s: 將s (包含json文檔的str, bytes或bytearray)反序列化為python對象
encoding: 指定一個(gè)編碼的格式
loads也是不需要文件描述符,其他參數(shù)的含義和load函數(shù)一致
json中的數(shù)據(jù)格式與python中的數(shù)據(jù)格式的轉(zhuǎn)化關(guān)系:
Json Python
object dict
array list
string str
number(int) int
number(real) flaot
true/false true/false
null None
dump和dumps實(shí)例:
import json
# dumps 可以格式化所有的基本數(shù)據(jù)類型為字符串
data_01 = json.dumps([1, 2, 3])
print(data_01, type(data_01))
data_02 = json.dumps(9)
print(data_02, type(data_02))
data_03 = json.dumps({ "city": 'shenzhen', "age": 18})
print(data_03, type(data_03))
def json_dumps_test(file_path, py_data):
with open(file_path, 'w', encoding='utf-8') as f:
f.write(json.dumps(py_data, indent=4))
# json.dump(py_data, f, indent=4)
json_dumps_test('./topic.json', data_03)
load和loads實(shí)例:
json_data = '{"name": "tom", "age": 20}'
py_data_01 = json.loads(json_data)
print(py_data_01, type(py_data_01))
with open("./topic.json", "r", encoding="utf-8") as f:
py_data_02 = json.loads(f.read()) # load 的傳入?yún)?shù)為字符串類型
print(py_data_02, type(py_data_02))
常見異常:
直接使用以下方式對多行json文件進(jìn)行讀取
with open("./topic.json", "r", encoding="utf-8") as f:
py_data_02 = json.loads(f.read())
會(huì)直接拋出JsonDecodeError異常,由于json只能讀取一個(gè)文檔對象,因此我們有兩個(gè)解決辦法:
- 單行讀取文件,一次讀取一行文件
with open(json_path, 'r') as f:
for line in f.readlines():
json_data = json.loads(line)
但這種方法依然有可能會(huì)拋出JsonDecodeError異常,即在json文件中包含空行時(shí),此時(shí)需要先處理空行在進(jìn)行文件讀取操作
- 將json文件處理為一個(gè)文件對象然后在進(jìn)行讀取文件
小結(jié):
- json.dumps 將 Python 對象編碼成 JSON 字符串
- json.loads 將已編碼的 JSON 字符串解碼為 Python 對象
- json.dump和json.load,需要傳入文件描述符,加上文件操作。
- JSON內(nèi)部的格式要注意,一個(gè)好的格式能夠方便讀取,可以用indent格式化。