json模塊提供了一種很簡單的方式來編碼和解碼JSON數(shù)據(jù)砸讳。編碼過程是把python對象轉(zhuǎn)換為JSON對象的一個過程售貌,解碼過程是把json對象轉(zhuǎn)換為python對象的一個過程。
編碼過程使用json.dumps()或json.dump()函數(shù)蜂桶。區(qū)別是dumps是將python對象生成一個JSON格式的字符串疫赎,而dump是將python對象轉(zhuǎn)換成JSON對象约炎,并將JSON對象通過fp文件對象寫入文件中。
>>> help(json.dumps)
Help on function dumps in module 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)
? ? Serialize ``obj`` to a JSON formatted ``str``.
其中ensure_ascii涧卵,如果dict內(nèi)含有非ASCII字符勤家,則會出現(xiàn)類似“\uXXXX”的格式顯示數(shù)據(jù),設置為false柳恐,就能正常顯示了伐脖。
JSON規(guī)范的數(shù)據(jù)格式對于Python語法而已幾乎是完全一樣的热幔,略有不同的是python中True會被映射為JSON格式中的true,F(xiàn)alse會被映射為false讼庇,None會被映射為null绎巨,元組()和列表[]會被映射為數(shù)組array,字典dict被映射為object蠕啄。如下表所示
為了遵循JSON規(guī)范认烁,你應該只編碼Python的lists 和dictionaries。對于dictionaries介汹,keys需要是字符串類型(字典中任何非字符串類型的key在編碼時會先轉(zhuǎn)換為字符串)却嗡。
>>> content={'a':None,'b':True,'c':False,'d':(1,2),'e':'中'}
>>> type(content)
<class 'dict'>
>>> content_str=json.dumps(content)
>>> content_str
'{"a": null, "b": true, "c": false, "d": [1, 2], "e": "\\u4e2d"}'
>>> json.dumps(content,ensure_ascii=False)
'{"a": null, "b": true, "c": false, "d": [1, 2], "e": "中"}'
>>>
從上面看出,dumps函數(shù)可以把特定的對象序列化處理為字符串嘹承。而dump函數(shù)用來寫入文件
>>> with open('D:\\json.txt','w') as fp:
...? ? json.dump(content,fp=fp,indent=4)? ? ? ? #按照indent顯示空白窗价,格式化顯示
...
在notepad中查看結果為
解碼過程常用的兩個函數(shù)是json.load()和json.loads()函數(shù)。區(qū)別跟dump()和dumps()一樣叹卷。
>>> help(json.loads)
Help on function loads in module json:
?
loads(s, *, encoding=None, cls=None,object_hook=None, parse_float=None, parse_int=None, parse_constant=None,object_pairs_hook=None, **kw)
???Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
???containing a JSON document) to a Python object.
其中撼港,encoding指定編碼格式。
可以把外形和list和dict類似的JSON格式的字符串反序列化為python對象中的list和dict骤竹。
>>> json_str='{"a": null,
"c": false, "b": true, "e": "中","d": [1,2]}'
>>> json.loads(json_str)
{'a': None, 'c': False, 'b': True, 'e': '中','d': [1, 2]}
>>> type(content)
>>> with open("D:\\json.txt",'r') asfp:
...????print(json.load(fp))
...
{'a': None, 'b': True, 'c': False, 'd': [1, 2], 'e': '中'}
>>>?
上述提到的序列化和反序列化是這么一個概念呢帝牡?
把內(nèi)存中的變量變成可存儲或可傳輸?shù)倪^程稱為序列化,內(nèi)存中的變量序列化后蒙揣,可以把序列化后的內(nèi)容寫入磁盤靶溜,或者通過網(wǎng)絡傳輸?shù)狡渌麢C器上。反過來懒震,把變量內(nèi)容從序列化的對象重新讀入到內(nèi)存中稱為反序列化罩息。
Json模塊中主要使用dumps和dump方法將任意對象序列化為一個str,然后將str寫入文件進行保存个扰。該模塊實現(xiàn)反序列化使用的是loads方法或load方法瓷炮,當把序列化后的文件從磁盤上讀取為一個str,就可以使用loads方法將str反序列化為對象递宅,或者直接使用load方法將文件直接反序列化為對象娘香。
假如我們在不同的編程語言中傳遞對象,把對象序列化為標準格式是關鍵办龄,如xml烘绽、json,這些格式很容易在網(wǎng)絡上傳輸土榴,而且被各種編程語言讀取解析诀姚。