Python JSON模塊
(一)什么是json:
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。
JSON建構于兩種結構:
“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
這些都是常見的數據結構。事實上大部分現代計算機語言都以某種形式支持它們。這使得一種數據格式在同樣基于這些結構的編程語言之間交換成為可能。
(二)Python JSON模塊
Python2.6開始加入了JSON模塊,無需另外下載,Python的Json模塊序列化與反序列化的過程分別是 encoding和 decoding。encoding-把一個Python對象編碼轉換成Json字符串;decoding-把Json格式字符串解碼轉換成Python對象。要使用json模塊必須先導入:
import json
1,簡單數據類型的處理
Python JSON模塊可以直接處理簡單數據類型(string、unicode、int、float、list、tuple、dict)。 json.dumps()方法返回一個str對象,編碼過程中會存在從python原始類型向json類型的轉化過程,具體的轉化對照如下:
json.dumps方法提供了很多好用的參數可供選擇,比較常用的有sort_keys(對dict對象進行排序,我們知道默認dict是無序存放的)、separators,indent等參數,dumps方法的定義為:
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True,cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False,**kw)
使用簡單的json.dumps方法對簡單數據類型進行編碼,例如:
輸出:(Python默認的item separator是‘, ’(不是','),所以list無論是轉化成字符串還是json格式,成員之間都是有空格隔開的)
我們接下來在對encodedjson進行decode,得到原始數據,需要使用的json.loads()函數。loads方法返回了原始的對象,但是仍然發生了一些數據類型的轉化,上例中‘abc’轉化為了unicode類型。需要注意的是,json字符串中的字典類型的key必須要用雙引號“”json.loads()才能正常解析。從json到python的類型轉化對照如下:
輸出:
sort_keys排序功能使得存儲的數據更加有利于觀察,也使得對json輸出的對象進行比較。下例中,data1和data2數據應該是一樣的,dict存儲的無序性造成兩者無法比較。
輸出:
indent參數是縮進的意思,它可以使數據的存儲格式更優雅、可讀性更強,這是通過增加一些冗余的空格進行填充的。但是在解碼(json.loads())時,空白填充會被刪除。
輸出:(可見loads時會將dumps時增加的intent 填充空格去除)
輸出:
DATA: {'a': 123, 'c': 456, 'b': 789} repr(data) : 30 dumps(data) : 30 dumps(data, indent=2) : 46 dumps(data, separators): 25
另一個比較有用的dumps參數是skipkeys,默認為False。 dumps方法存儲dict對象時key必須是str類型,其他類型會導致TypeError異常產生,如果將skipkeys設為True則會優雅的濾除非法keys。
輸出:
original data: {(1, 2): 123, 'c': 456, 'b': 789} json encoded {"c": 456, "b": 789}
2,JSON處理自定義數據類型
json模塊不僅可以處理普通的python內置類型,也可以處理我們自定義的數據類型,而往往處理自定義的對象是很常用的。
如果直接通過json.dumps方法對Person的實例進行處理的話,會報錯,因為json無法支持這樣的自動轉化。通過上面所提到的json和 python的類型轉化對照表,可以發現,object類型是和dict相關聯的,所以我們需要把我們自定義的類型轉化為dict,然后再進行處理。這里,有兩種方法可以使用。
方法一:自己寫轉化函數
自定義object類型和dict類型進行轉化:encode-定義函數 object2dict()將對象模塊名、類名以及__dict__存儲在一個字典并返回;decode-定義dict2object()解析出模塊名、類名、參數,創建新的對象并返回。在json.dumps()中通過default參數指定轉化過程中調用的函數;json.loads()則通過 object_hook指定轉化函數。
方法二:繼承JSONEncoder和JSONDecoder類,覆寫相關方法
JSONEncoder類負責編碼,主要是通過其default函數進行轉化,我們可以重載該方法。對于JSONDecoder,亦然。
輸出:
來自:http://blog.csdn.net/suipingsp/article/details/39480341