javascript
Python中JSON的基本使用
?
?
?
JSON (JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。Python3 中可以使用 json 模塊來對 JSON 數(shù)據(jù)進行編解碼,它主要提供了四個方法:?dumps、dump、loads、load。
dump和dumps
dump和dumps對python對象進行序列化。將一個Python對象進行JSON格式的編碼。
dump函數(shù):
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)- 1
obj: 表示是要序列化的對象。
fp: 文件描述符,將序列化的str保存到文件中。json模塊總是生成str對象,而不是字節(jié)對象;因此,fp.write()必須支持str輸入。
skipkeys: 默認為False,如果skipkeysTrue,(默認值:False),則將跳過不是基本類型(str,int,float,bool,None)的dict鍵,不會引發(fā)TypeError。
ensure_ascii: 默認值為True,能將所有傳入的非ASCII字符轉義輸出。如果ensure_ascii為False,則這些字符將按原樣輸出。
check_circular:默認值為True,如果check_circular為False,則將跳過對容器類型的循環(huán)引用檢查,循環(huán)引用將導致OverflowError。
allow_nan: 默認值為True,如果allow_nan為False,則嚴格遵守JSON規(guī)范,序列化超出范圍的浮點值(nan,inf,-inf)會引發(fā)ValueError。 如果allow_nan為True,則將使用它們的JavaScript等效項(NaN,Infinity,-Infinity)。
indent: 設置縮進格式,默認值為None,選擇的是最緊湊的表示。如果indent是非負整數(shù)或字符串,那么JSON數(shù)組元素和對象成員將使用該縮進級別進行輸入;indent為0,負數(shù)或“”僅插入換行符;indent使用正整數(shù)縮進多個空格;如果indent是一個字符串(例如“\t”),則該字符串用于縮進每個級別。
separators: 去除分隔符后面的空格,默認值為None,如果指定,則分隔符應為(item_separator,key_separator)元組。如果縮進為None,則默認為(’,’,’:’);要獲得最緊湊的JSON表示,可以指定(’,’,’:’)以消除空格。
default: 默認值為None,如果指定,則default應該是為無法以其他方式序列化的對象調(diào)用的函數(shù)。它應返回對象的JSON可編碼版本或引發(fā)TypeError。如果未指定,則引發(fā)TypeError。
sort_keys: 默認值為False,如果sort_keys為True,則字典的輸出將按鍵值排序。
dumps函數(shù):
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)- 1
dumps函數(shù)不需要傳文件描述符,其他的參數(shù)和dump函數(shù)的一樣。
load和loads
load和loads反序列化方法,將json格式數(shù)據(jù)解碼為python對象。
load函數(shù):
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)- 1
fp: 文件描述符,將fp(.read()支持包含JSON文檔的文本文件或二進制文件)反序列化為Python對象。
object_hook: 默認值為None,object_hook是一個可選函數(shù),此功能可用于實現(xiàn)自定義解碼器。指定一個函數(shù),該函數(shù)負責把反序列化后的基本類型對象轉換成自定義類型的對象。
parse_float: 默認值為None,如果指定了parse_float,用來對JSON?float字符串進行解碼,這可用于為JSON浮點數(shù)使用另一種數(shù)據(jù)類型或解析器。
parse_int: 默認值為None,如果指定了parse_int,用來對JSON?int字符串進行解碼,這可以用于為JSON整數(shù)使用另一種數(shù)據(jù)類型或解析器。
parse_constant:默認值為None,如果指定了parse_constant,對-Infinity,Infinity,NaN字符串進行調(diào)用。如果遇到了無效的JSON符號,會引發(fā)異常。
如果進行反序列化(解碼)的數(shù)據(jù)不是一個有效的JSON文檔,將會引發(fā)?JSONDecodeError異常。
loads函數(shù):
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)- 1
s: 將s(包含JSON文檔的str,bytes或bytearray實例)反序列化為Python對象。
encoding: 指定一個編碼的格式。
loads也不需要文件描述符,其他參數(shù)的含義和load函數(shù)的一致。
格式轉化表
JSON中的數(shù)據(jù)格式和Python中的數(shù)據(jù)格式轉化關系如下:
| object | dict |
| array | list |
| string | str |
| number (int) | int |
| number (real) | float |
| true | True |
| false | False |
| null | None |
實例:
dump和dumps
import json# dumps可以格式化所有的基本數(shù)據(jù)類型為字符串 data1 = json.dumps([]) # 列表 print(data1, type(data1)) data2 = json.dumps(2) # 數(shù)字 print(data2, type(data2)) data3 = json.dumps('3') # 字符串 print(data3, type(data3)) dict = {"name": "Tom", "age": 23} # 字典 data4 = json.dumps(dict) print(data4, type(data4))with open("test.json", "w", encoding='utf-8') as f:# indent 超級好用,格式化保存字典,默認為None,小于0為零個空格f.write(json.dumps(dict, indent=4))json.dump(dict, f, indent=4) # 傳入文件描述符,和dumps一樣的結果- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
得到的輸出結果如下:格式化所有的數(shù)據(jù)類型為str類型
[] <class 'str'> 2 <class 'str'> "3" <class 'str'> {"name": "Tom", "age": 23} <class 'str'>- 1
- 2
- 3
- 4
test.json中的內(nèi)容
{"name": "Tom","age": 23 }- 1
- 2
- 3
- 4
load和loads
import jsondict = '{"name": "Tom", "age": 23}' # 將字符串還原為dict data1 = json.loads(dict) print(data1, type(data1))with open("test.json", "r", encoding='utf-8') as f:data2 = json.loads(f.read()) # load的傳入?yún)?shù)為字符串類型print(data2, type(data2))f.seek(0) # 將文件游標移動到文件開頭位置data3 = json.load(f)print(data3, type(data3))- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
運行結果如下:
{'name': 'Tom', 'age': 23} <class 'dict'> {'name': 'Tom', 'age': 23} <class 'dict'> {'name': 'Tom', 'age': 23} <class 'dict'>- 1
- 2
- 3
常見的錯誤:
讀取多行的JSON文件
假如要讀取一個多行的JSON文件:
{"坂": ["坂5742"]} {"構": ["構6784"]} {"共": ["共5171"]} {"鉤": ["鉤94a9"]} {"骯": ["骯80ae"]} {"孤": ["孤5b64"]}- 1
- 2
- 3
- 4
- 5
- 6
如果直接使用:
with open(json_path, 'r') as f:json_data = json.load(f)- 1
- 2
就會報錯:拋出異常JSONDecodeError。
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 17)- 1
表示數(shù)據(jù)錯誤,數(shù)據(jù)太多,第2行第一列
因為json只能讀取一個文檔對象,有兩個解決辦法
1、單行讀取文件,一次讀取一行文件。
2、保存數(shù)據(jù)源的時候,格式寫為一個對象。
單行讀取文件:
with open(json_path, 'r') as f:for line in f.readlines():json_data = json.loads(line)- 1
- 2
- 3
但是這種做法還有個問題,如果JSON文件中包含空行,還是會拋出JSONDecodeError異常
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)- 1
可以先處理空行,再進行文件讀取操作:
for line in f.readlines():line = line.strip() # 使用strip函數(shù)去除空行if len(line) != 0:json_data = json.loads(line)- 1
- 2
- 3
- 4
合并為一個對象
將json文件處理成一個對象文件。
{"dict": [ {"坂": ["坂5742"]}, {"構": ["構6784"]}, {"共": ["共5171"]}, {"鉤": ["鉤94a9"]}, {"骯": ["骯80ae"]}, {"孤": ["孤5b64"]} ]}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然后再用:
with open(json_path, 'r') as f:json_data = json.loads(f.read())- 1
- 2
總結:
json.dumps?將 Python 對象編碼成 JSON 字符串
json.loads?將已編碼的 JSON 字符串解碼為 Python 對象
json.dump和json.load,需要傳入文件描述符,加上文件操作。
JSON內(nèi)部的格式要注意,一個好的格式能夠方便讀取,可以用indent格式化。
參考鏈接:
https://docs.python.org/3.6/library/json.html#py-to-json-table
https://www.cnblogs.com/tjuyuan/p/6795860.html
http://liuzhijun.iteye.com/blog/1859857
https://blog.csdn.net/qq_22073849/article/details/78192289
http://www.runoob.com/python3/python3-json.html
總結
以上是生活随笔為你收集整理的Python中JSON的基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc/g++ 编译器出现 undefi
- 下一篇: ubuntu18下安装微信