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.dumps
和json.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)置對象dump
為json
對象我們知道如何操作了,那如何從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)
json
和Python
對象轉(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]}]