1. 程式人生 > >Python下JSON格式的讀寫

Python下JSON格式的讀寫

一、

JSON (JavaScript Object Notation)是一種資料交換格式。

JSON 的規定字符集是UTF-8,字串必須使用""雙引號,Object的鍵也必須使用雙引號,不能使用單引號;

JSON格式的陣列或者物件中,不同的元素用逗號隔開,最後一個元素後面,不能加逗號。

二、

1、dump()和load()

dump主要用來json檔案寫入,和load(讀取)配合使用。

dump的引數:(譯自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)

skipkeys: 如果' skipkeys '=true(預設為False),那麼如果' dict '鍵不是基本型別

('str','int','float','bool','None'),將被忽略而不是丟擲TypeError。

ensure_ascii: 如果ensure_ascii=False(預設為True),返回值可以包含非ASCII字元(如果‘obj’中有非ASCII字元),若為True,則所有返回的字元都是用JSON轉義後的。

check_circular: 如果check_circular=False(預設為True),那麼對於容器型別的迴圈引用檢查將被跳過,可能導致溢位錯誤或者更糟。

allow_nan: 如果allow_nan=False(預設為True),那麼在嚴格的JSON規範中,序列化外的float值(‘nan’,‘inf’,‘-inf’)將會有ValueError,而不是使用JavaScript中等同的值代替(‘NaN’,‘Infinity’,‘-Infinity’)。

indent: 如果' indent '是一個非負整數,那麼JSON陣列元素和物件成員將以indent為縮排級別進行列印。一個縮排0的級別只會插入新的行。“None”表示沒有縮排(預設為None)。

separators:如果指定,'分隔符'應該是(item_separator, key_separator) 元組,預設值為''(',',':')'';如果縮排是None和''(',',':')'',要獲得最緊湊的JSON展示,您應該指定''(',',':')''以消除空格(預設為None)。

default: 對於obj ,'default(obj)'是一個應該返回可序列化版本的函式或引發TypeError。預設值只會引發TypeError。

sort_keys: 如果sort_keys=True(預設為' ' False '),則輸出的字典將按鍵排序。

>>>import json
>>>data = [{'a': 'apple', 'b': 'banana', 'c': [1, 2, 3]}, 11, 'test', True]
>>>f = open('./test.txt', 'a')
>>>json.dump(data, f)  # 寫入檔案後,單引號會被轉換成雙引號
>>>f.close()

>>>f = open('./test.txt', 'r')
>>>temp = json.load(f)
>>>temp
[{'a': 'apple', 'b': 'banana', 'c': [1, 2, 3]}, 11, 'test', True]
>>>type(temp)
<class 'list'>

使用dump寫入檔案後,單引號會被轉換成雙引號,如圖:

2、dumps()和loads()

dumps()  # 把特定的物件序列化處理為字串

 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)  # 引數用法和dump基本相同

loads()  # 把字串反序列化為物件

  loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

object_hook:“object_hook”是一個可選函式,任何物件文字解碼的結果都可以呼叫它(一個'dict')。返回值“object_hook”將代替“dict”。這個特性可以用於實現自定義解碼器(例如,JSON-RPC類提示)。

parse_float:如果指定,它將被呼叫,每個JSON float的字串將被解碼。預設情況下,這相當於float(num_str)。這可以用於使用另一個數據型別或解析器。對於JSON浮點數(例如:decimal.Decimal . decimal)。

parse_int:如果指定,將使用字串呼叫parse_int '要解碼的每個JSON整數。預設情況下,這是等價的int(num_str)。這可以用於使用另一個數據型別或解析器。對於JSON整數(例如浮點數)。

parse_constant:如果指定'parse_constant',將使用以下字串之一呼叫:-Infinity、Infinity、NaN。如果遇到無效的JSON數字,可以使用它來引發異常。

object_pairs_hook:'object_pairs_hook '是一個可選的函式,它將被呼叫的結果與一個有序的雙成對列表的結果相匹配。將使用' object_pairs_hook ' 的返回值而不是' dict '。此特性可用於實現自定義解碼器,該解碼器依賴於金鑰和值對解碼的順序(例如,集合、OrderedDict將記住插入的順序)。如果' object_hook '也被定義,那麼' object_pairs_hook '將優先。

>>>js = json.dumps(data)
>>>js
'[{"a": "apple", "b": "banana", "c": [1, 2, 3]}, 11, "test", true]'
>>>type(js)
<class 'str'>

>>>data2 = [{'b': 'banana'}, {'a': 'apple'}, {'c': [1, 2, 3]}]
>>>a = json.dumps(data2, indent=2)  # 縮排
>>>f = open('D:\\Users\\Dong\\Desktop\\test2.txt','w')
>>>f.write(a)
>>>f.close()

>>>ja = json.loads(js)
>>>ja
[{"a": "apple", "b": "banana", "c": [1, 2, 3]}, 11, "test", true]
>>>type(ja)
<class 'list'>

test2.txt內容如圖: