最近接觸到一些JSON的知識,順便學習一下Python對Json的操作。
一、JSON簡介:
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於JavaScript(StandardECMA-262 3rd Edition - December 1999)的一個子集。JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript,Perl, Python等)。這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。
JSON和Python中的字典非常像。記得從某個地方看到過:JSON就是Python字典的字符串表示,但是字典作為一個復雜對象是無法直接轉換成定義它的代碼的字符串,因為JSON是純文本。
二、Python的JSON模塊
python自帶JSON處理模塊(2.6版本之後),模塊名就叫做Python。直接在Python Shell中輸入help(json)就可以查看許多相關的信息。其實無外乎是python類型的數據和JSON格式數據之間的相互轉換。從Python生成JSON對應模塊中的dump和dumps方法,解析JSON成Python的數據類型對應模塊中的loads和load方法。
1.Python生成JSON對應模塊中的dump和dumps方法:
兩個方法的區別在於dumps方法處理的是字符串,dump處理的是文件對象,比如StringIO轉化過後的字符串。
import json from StringIO import StringIO a = ['foo', {'bar': ('baz', None, 1.0, 2)}] print("a 的類型是 %s" % type(a)) b = json.dumps(a) print("轉換成JSON格式:%s, 類型是 %s" % (b, type(b))) #["foo", {"bar": ["baz", null, 1.0, 2]}],類型是str io = StringIO() json.dump(a, io) print("把原類型編碼到文件對象:%s, 類型是 %s" % (io.getvalue(), type(io))) #把json編碼數據導向到文件對象
JSON編碼過程中會對原數據進行一些變換,具體轉換如下表:
dumps方法有幾個比較有用的參數:sort_keys控制是否排序(True or False),indent定義縮進大小(int類型),separators是一個元組,定義分隔符的類型。具體示例如下:
#pretty print s = json.dumps(a, sort_keys=True, indent=4, separators=('!', '?')) #分隔符這裡只是測試,一般保持默認逗號和分號即可 print s #輸出結果為 [ "foo"! { "bar"?[ "baz"! null! 1.0! 2 ] } ]
另一個比較有用的dumps參數是skipkeys,默認為False。 dumps方法編碼dict對象時,key必須是str類型(數字也可以,但是元組不可以),如果出現了其他類型的話,那麼會產生TypeError異常(需要注意),如果該參數設為True的話,則會跳過異常的key。示例如下:
try: data = {'a':1, 'b':2, (1,):3} json.dumps(data) except TypeError,e: print e #keys must be a string print json.dumps(data,skipkeys=True) #{"a": 1, "b": 2} data = {'a':1, 'b':2, 1:3} print json.dumps(data) #注意,此處不報錯而是轉成了字符串類型:{"a": 1, "1": 3, "b": 2}
2、解析JSON成Python的數據類型對應模塊中的loads和load方法
兩個方法的區別同dump和dumps。具體示例如下:
c = json.loads(b) print("從JSON格式轉成python類型:%s, 類型是 %s" % (c, type(c))) #[u'foo', {u'bar': [u'baz', None, 1.0, 2]}],類型是list io = StringIO('["streaming API"]') d = json.load(io) print("從JSON格式解碼到流文件中:%s, 類型是 %s" % (d, type(d))) #[u'streaming API'], 類型是 <type 'list'>
可以看出來loads方法返回了原始的對象,但是做了數據類型的轉化,字符串轉換成unicode類型,原來的tuple也沒有轉換過來,只轉成了list類型。對應的默認轉換如下:
此外官方文檔中還有兩個方法,暫時還沒有研究過,待補充:
JSONDecoder([encoding[,object_hook[, parse_float[,parse_int[, parse_constant[,strict[, object_pairs_hook]]]]]]])
JSONEncoder([skipkeys[,ensure_ascii[, check_circular[,allow_nan[, sort_keys[,indent[, separators[,encoding[, default]]]]]]]]])
零基礎如何入門Python http://www.linuxidc.com/Linux/2016-10/136485.htm
Ubuntu 14.04安裝Python 3.3.5 http://www.linuxidc.com/Linux/2014-05/101481.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
在CentOS 6.5上安裝Python2.7 http://www.linuxidc.com/Linux/2016-10/136206.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm