天天看點

《Python Cookbook(第3版)中文版》——6.2 讀寫JSON資料

本節書摘來自異步社群《python cookbook(第3版)中文版》一書中的第6章,第6.2節,作者[美]david beazley , brian k.jones,陳舸 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

我們想讀寫以json(javascript object notation)格式編碼的資料。

json子產品中提供了一種簡單的方法來編碼和解碼json格式的資料。這兩個主要的函數就是json.dumps()以及json.loads()。這兩個函數在命名上借鑒了其他序列化處理庫的接口,比如pickle。下面的示例展示了如何将python資料結構轉換為json:

而接下來的示例告訴我們如何把json編碼的字元串再轉換回python資料結構:

如果要同檔案而不是字元串打交道的話,可以選擇使用json.dump()以及json.load()來編碼和解碼json資料。示例如下:

json編碼支援的基本類型有none、bool、int、float和str,當然還有包含了這些基本類型的清單、元組以及字典。對于字典,json會假設鍵(key)是字元串(字典中的任何非字元串鍵都會在編碼時轉換為字元串)。要符合json規範,應該隻對python清單和字典進行編碼。此外,在web應用中,把最頂層對象定義為字典是一種标準做法。

json編碼的格式幾乎與python文法一緻,隻有幾個小地方稍有不同。比如,true會被映射為true,false會被映射為false,而none會被映射為null。下面的示例展示了編碼看起來是怎樣的:

如果要檢查從json中解碼得到的資料,那麼僅僅将其列印出來就想确定資料的結構通常是比較困難的——尤其是如果資料中包含了深層次的嵌套結構或者有許多字段時。為了幫助解決這個問題,考慮使用pprint子產品中的pprint()函數。這麼做會把鍵按照字母順序排列,并且将字典以更加合理的方式進行輸出。下面的示例展示了應該如何對twitter上的搜尋結果以漂亮的格式進行輸出:

一般來說,json解碼時會從所提供的資料中建立出字典或者清單。如果想建立其他類型的對象,可以為json.loads()方法提供object_pairs_hook或者object_hook參數。例如,下面的示例展示了我們應該如何将json資料解碼為ordereddict(有序字典),這樣可以保持資料的順序不變:

而下面的代碼将json字典轉變為python對象:

在上一個示例中,通過解碼json資料而建立的字典作為單獨的參數傳遞給了__init__()。之後就可以自由地根據需要來使用它了,比如直接将它當做對象的字典執行個體來用。

有幾個選項對于編碼json來說是很有用的。如果想讓輸出格式變得漂亮一些,可以在json.dumps()函數中使用indent參數。這會使得資料能夠像pprint()函數那樣以漂亮的格式列印出來。示例如下:

如果想在輸出中對鍵進行排序處理,可以使用sort_keys參數:

類執行個體一般是無法序列化為json的。比如說:

如果想序列化類執行個體,可以提供一個函數将類執行個體作為輸入并傳回一個可以被序列化處理的字典。示例如下:

如果想取回一個執行個體,可以編寫這樣的代碼來處理:

最後給出如何使用這些函數的示例: