簡介
JSON的全稱是 JaveScript Object Notation ,即JavaScript對象符合。JSON是一種輕量級的,跨平臺,跨語言的數據交換格式,其設計的目的,是將所有的事情都用設計的字符串來表示,這樣可以方便在網上傳輸數據,也便於人類閱讀。
在早期,JSON是JavaScript語言的數據交換格式,後來發展爲與特定的編程語言無關的數據交互格式,類似於XML。因此JSON是一種非常理想的數據交換格式。
JSON主要有兩種數據結構:
- 由key-value對組成的數據結構,這樣的數據結構在不同的編程語言中具有不同的實現,比如在Python中是一種字典,在C語言中是一個struct;
- 有序集合,這樣的數據結構,在Python中對應列表,在C語言中對應數組等。
Python的JSON支持
在Python語言中,json模塊提供了對JSON的支持。json模塊包含了將JSON字符串恢復成Python對象的函數,也包含了將Python對象轉換爲JSON字符串的函數。
JSON類型轉換爲Python類型的對應關係
JSON類型 | Python類型 |
---|---|
對象object | 字典dict |
數組array | 列表list |
字符串string | 字符串str |
整數int | 整數int |
實數real | 浮點數float |
true | True |
false | False |
null | None |
在Python交互式解釋器中導入json模塊後,通過__all__屬性可以知道json模塊的全部屬性與函數:
>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']
在json模塊中常用的函數包括:
#將 obj 對象轉換成 JSON 字符串輸出到 fp 流中,fp 是一個支持 write() 方法的類文件對象
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 對象轉換爲 JSON 字符串,並返回該 JSON 字符串
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)
#從 fp 流讀取 JSON 字符串,將其恢復成 JSON 對象,其中 fp 是一個支持 read() 方法的類文件對象
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
#將 JSON 字符串 s 恢復成 JSON 對象
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
將Python對象轉換爲JSON字符串 範例
範例代碼如下,實際上dumps與dump函數的功能,所支持的選項基本相同,只是dumps函數直接返回轉換得到的JSON字符串,而dump函數則將轉換得到的JSON字符串輸出到文件中:
import json
# 將Python對象轉JSON字符串(元組會當成數組)
s = json.dumps(['yeeku', {'favorite': ('coding', None, 'game', 25)}])
print(s) # ["yeeku", {"favorite": ["coding", null, "game", 25]}]
# 簡單的Python字符串轉JSON
s2 = json.dumps("\"foo\bar")
print(s2) #"\"foo\bar"
# 簡單的Python字符串轉JSON
s3 = json.dumps('\\')
print(s3) #"\\"
# Python的dict對象轉JSON,並對key排序
s4 = json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
print(s4) #{"a": 0, "b": 0, "c": 0}
# 將Python列表轉JSON,
# 並指定JSON分隔符:逗號和冒號之後沒有空格(默認有空格)
s5 = json.dumps([1, 2, 3, {'x': 5, 'y': 7}], separators=(',', ':'))
# 輸出的JSON字符串中逗號和冒號之後沒有空格
print(s5) # '[1,2,3,{"4":5,"6":7}]'
# 指定indent爲4,意味着轉換的JSON字符串有縮進
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
print(s6)
# 使用JSONEncoder的encode方法將Python轉JSON
s7 = json.JSONEncoder().encode({"names": ("孫悟空", "齊天大聖")})
print(s7) # {"names": ["\u5b59\u609f\u7a7a", "\u9f50\u5929\u5927\u5723"]}
f = open('a.json', 'w')
# 使用dump()函數將轉換得到JSON字符串輸出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)
將JSON字符串轉換爲Python對象 範例
範例代碼如下:
import json
# 將JSON字符串恢復成Python列表
result1 = json.loads('["yeeku", {"favorite": ["coding", null, "game", 25]}]')
print(result1) # ['yeeku', {'favorite': ['coding', None, 'game', 25]}]
# 將JSON字符串恢復成Python字符串
result2 = json.loads('"\\"foo\\"bar"')
print(result2) # "foo"bar
# 定義一個自定義的轉化函數
def as_complex(dct):
if '__complex__' in dct:
return complex(dct['real'], dct['imag'])
return dct
# 使用自定義的恢複函數
# 自定義回複函數將real數據轉成複數的實部,將imag轉成複數的虛部
result3 = json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
print(result3) # (1+2j)
f = open('a.json')
# 從文件流恢復JSON列表
result4 = json.load(f)
print(result4) # ['Kotlin', {'Python': 'excellent'}]