天天看點

Python處理JSON(轉)

<a href="http://liuzhijun.iteye.com/blog/1859857" target="_blank">參考:</a>

概念

序列化(Serialization):将對象的狀态資訊轉換為可以存儲或可以通過網絡傳輸的過程,傳輸的格式可以是JSON、XML等。反序列化就是從存儲區域(JSON,XML)讀取反序列化對象的狀态,重新建立該對象。

JSON(JavaScript Object Notation):一種輕量級資料交換格式,相對于XML而言更簡單,也易于閱讀和編寫,機器也友善解析和生成,Json是JavaScript中的一個子集。

Python2.6開始加入了JSON子產品,無需另外下載下傳,Python的Json子產品序列化與反序列化的過程分别是 encoding和 decoding

encoding:把一個Python對象編碼轉換成Json字元串

decoding:把Json格式字元串解碼轉換成Python對象

對于簡單資料類型(string、unicode、int、float、list、tuple、dict),可以直接處理。

輸出:

輸出:

編碼後的json格式字元串緊湊的輸出,而且也沒有順序,是以<code>dumps</code>方法提供了一些可選的參數,讓輸出的格式提高可讀性,如<code>sort_keys</code>是告訴編碼器按照字典排序(a到z)輸出。

<code>indent</code>參數根據資料格式縮進顯示,讀起來更加清晰:

<code>separators</code>參數的作用是去掉<code>,</code>,<code>:</code>後面的空格,從上面的輸出結果都能看到", :"後面都有個空格,這都是為了美化輸出結果的作用,但是在我們傳輸資料的過程中,越精簡越好,備援的東西全部去掉,是以就可以加上separators參數:

<code>skipkeys</code>參數,在encoding過程中,dict對象的key隻可以是string對象,如果是其他類型,那麼在編碼過程中就會抛出<code>ValueError</code>的異常。<code>skipkeys</code>可以跳過那些非string對象當作key的處理.

以上例子都是基于python的built-in類型的,對于自定義類型的資料結構,json子產品預設是沒法處理的,會抛出異常:<code>TypeError xx is not JSON serializable</code>,此時你需要自定義一個轉換函數:

相反,如果要把json decode 成python對象,同樣也需要自定轉換函數,傳遞給json.loads方法的<code>object_hook</code>參數:

JSONEncoder有一個疊代接口<code>iterencode(data)</code>,傳回一系列編碼的資料,他的好處是可以友善的把逐個資料寫到檔案或網絡流中,而不需要一次性就把資料讀入記憶體.

<code>encode</code>方法等價于<code>''.join(encoder.iterencode()</code>,而且預先會做些錯誤檢查(比如非字元串作為dict的key),對于自定義的對象,我們隻需從些JSONEncoder的<code>default()</code>方法,其實作方式與上面提及的函數<code>convet_to_builtin_type()</code>是類似的。

從json對Python對象的轉換:

上面的例子都是在記憶體中操作的,如果對于大資料,把他編碼到一個類檔案(file-like)中更合适,<code>load()</code>和<code>dump()</code>方法就可以實作這樣的功能。

類似的:

參考:

<a href="http://docs.python.org/2/library/json.html">http://docs.python.org/2/library/json.html</a>

<a href="http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html">http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html</a>

<a href="http://pymotw.com/2/json/">http://pymotw.com/2/json/</a>