Python: json模塊實例詳解

Python: Json實例

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式鹃答。易于人閱讀和編寫荤胁。同時也易于機(jī)器解析和生成劳较。

數(shù)據(jù)格式可以簡單地理解為鍵值對的集合(A collection of name/value pairs)购撼。不同的語言中,它被理解為對象(object),紀(jì)錄(record)畏铆,結(jié)構(gòu)(struct),字典(dictionary)吉殃,哈希表(hash table)辞居,有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組 (associative array)蛋勺。
值的有序列表(An ordered list of values)瓦灶。在大部分語言中,它被理解為數(shù)組(array)迫卢。

import json

Pyhton的Json模塊提供了把內(nèi)存中的對象序列化的方法倚搬。

json.dumps

dump的功能就是把Python對象encode為json對象,一個編碼過程乾蛤。注意json模塊提供了json.dumpsjson.dump方法每界,區(qū)別是dump直接到文件捅僵,而dumps到一個字符串,這里的s可以理解為string眨层。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

data_string = json.dumps(data)
print 'JSON:', data_string
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]

查看其類型庙楚,發(fā)現(xiàn)是string對象。

print type(data)
print type(data_string)
<type 'list'>
<type 'str'>

json.dump

不僅可以把Python對象編碼為string趴樱,還可以寫入文件馒闷。因為我們不能把Python對象直接寫入文件,這樣會報錯TypeError: expected a string or other character buffer object叁征,我們需要將其序列化之后才可以纳账。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
with open('output.json','w') as fp:
    json.dump(data,fp)
cat output.json
[{"a": "A", "c": 3.0, "b": [2, 4]}]

json.loads

Python內(nèi)置對象dumpjson對象我們知道如何操作了,那如何從json對象decode解碼為Python可以識別的對象呢捺疼?是的用json.loads方法疏虫,當(dāng)然這個是基于string的,如果是文件啤呼,我們可以用json.load方法卧秘。

decoded_json = json.loads(data_string)
# 和之前一樣,還是list
print type(decoded_json)
<type 'list'>
# 像訪問 data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]一樣
print decoded_json[0]['a']
A

json.load

可以直接load文件官扣。

with open('output.json') as fp:
    print type(fp)
    loaded_json = json.load(fp)
<type 'file'>
# 和之前一樣翅敌,還是list
print type(decoded_json)
<type 'list'>
# 像訪問 data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]一樣
print decoded_json[0]['a']
A

數(shù)據(jù)類型對應(yīng)

jsonPython對象轉(zhuǎn)換過程中,數(shù)據(jù)類型不完全一致惕蹄,有對應(yīng)蚯涮。

Python Json
dict object
list,tuple array
str, unicode string
int,long,float number
True true
False false
None null

json.dumps常用參數(shù)

一些參數(shù),可以讓我們更好地控制輸出焊唬。常見的比如sort_keys恋昼,indent看靠,separators赶促,skipkeys等。

sort_keys名字就很清楚了挟炬,輸出時字典的是按鍵值排序的鸥滨,而不是隨機(jī)的。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}]

indent就是更個縮進(jìn)谤祖,讓我們更好地看清結(jié)構(gòu)婿滓。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)
print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    "a": "A", 
    "b": [
      2, 
      4
    ], 
    "c": 3.0
  }
]

separators是提供分隔符,可以出去白空格粥喜,輸出更緊湊凸主,數(shù)據(jù)更小。默認(rèn)的分隔符是(', ', ': ')额湘,有白空格的卿吐。不同的dumps參數(shù)旁舰,對應(yīng)文件大小一目了然。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)             :', len(repr(data))
print 'dumps(data)            :', len(json.dumps(data))
print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
repr(data)             : 35
dumps(data)            : 35
dumps(data, indent=2)  : 76
dumps(data, separators): 29

json需要字典的的鍵是字符串嗡官,否則會拋出ValueError箭窜。

data = [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]

print 'First attempt'
try:
    print json.dumps(data)
except (TypeError, ValueError) as err:
    print 'ERROR:', err

print
print 'Second attempt'
print json.dumps(data, skipkeys=True)
First attempt
ERROR: keys must be a string

Second attempt
[{"a": "A", "c": 3.0, "b": [2, 4]}]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衍腥,隨后出現(xiàn)的幾起案子磺樱,更是在濱河造成了極大的恐慌,老刑警劉巖婆咸,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹捉,死亡現(xiàn)場離奇詭異,居然都是意外死亡尚骄,警方通過查閱死者的電腦和手機(jī)活孩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乖仇,“玉大人憾儒,你說我怎么就攤上這事∧松常” “怎么了起趾?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長警儒。 經(jīng)常有香客問我训裆,道長,這世上最難降的妖魔是什么蜀铲? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任边琉,我火速辦了婚禮,結(jié)果婚禮上记劝,老公的妹妹穿的比我還像新娘变姨。我一直安慰自己,他們只是感情好厌丑,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布定欧。 她就那樣靜靜地躺著,像睡著了一般怒竿。 火紅的嫁衣襯著肌膚如雪砍鸠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天耕驰,我揣著相機(jī)與錄音爷辱,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛饭弓,可吹牛的內(nèi)容都是我干的巩检。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼示启,長吁一口氣:“原來是場噩夢啊……” “哼兢哭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夫嗓,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤迟螺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舍咖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矩父,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年排霉,在試婚紗的時候發(fā)現(xiàn)自己被綠了窍株。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡攻柠,死狀恐怖球订,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瑰钮,我是刑警寧澤冒滩,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站浪谴,受9級特大地震影響开睡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苟耻,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一篇恒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凶杖,春花似錦胁艰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽醋虏。三九已至寻咒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颈嚼,已是汗流浹背毛秘。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叫挟。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓艰匙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抹恳。 傳聞我的和親對象是個殘疾皇子员凝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容