json介紹
說明:JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個(gè)子集。 JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。
關(guān)于json更為詳細(xì)的內(nèi)容,可以參考其官方網(wǎng)站:http://www.json.org
從官方網(wǎng)站上摘取部分,了解一下json的結(jié)構(gòu):
JSON建構(gòu)于兩種結(jié)構(gòu):
- 名稱/值”對(duì)的集合(A collection of name/value pairs)。不同的語言中,它被理解為對(duì)象(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)。
python標(biāo)準(zhǔn)庫中有json模塊,主要是執(zhí)行序列化和反序列化功能:
序列化:encoding,把一個(gè)python對(duì)象編碼轉(zhuǎn)化成json字符串,json.dumps()
反序列化:decoding,把json格式字符串解碼轉(zhuǎn)換為python數(shù)據(jù)對(duì)象,json.loads()
一般json
查看json使用方法
>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
encoding: dumps()
>>> data = [{"name":"qiwsir", "lang":("python", "english"), "age":40}]
>>> print data
[{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}]
>>> data_json = json.dumps(data)
>>> print data_json
[{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]
encoding的操作是比較簡(jiǎn)單的,請(qǐng)注意觀察data和data_json的不同——lang的value從元組變成了列表,還有不同:
>>> type(data_json)
<type 'str'>
>>> type(data)
<type 'list'>
將python對(duì)象轉(zhuǎn)化為json類型,是按照下表所示對(duì)照關(guān)系轉(zhuǎn)化的:
python | json |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
decoding: loads()
decoding的過程也像上面一樣簡(jiǎn)單:
>>> new_data = json.loads(data_json)
>>> new_data
[{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]
需要注意的是,解碼之后,并沒有將元組還原。
解碼的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系:
json | python |
---|---|
object | dict |
array | list, tuple |
string | str, unicode |
number(int) | int, long |
number(read) | float |
true | True |
false | False |
null | None |
上面的data都不是很長(zhǎng),還能湊合閱讀,如果很長(zhǎng)了,閱讀就有難度了。所以,json的dumps()提供了可選參數(shù),利用它們能在輸出上對(duì)人更友好(這對(duì)機(jī)器是無所謂的)。
>>> data={'a':'aaa', 'b':'bbb', 'c':[{'c1':'cc1', 'c2':'cc2'}]}
>>> data_j = json.dumps(data, sort_keys=True, indent=2)
>>> print data_j
{
"a": "aaa",
"b": "bbb",
"c": [
{
"c1": "cc1",
"c2": "cc2"
}
]
}
sort_keys=True
意思是按照鍵的字典順序排序,indent=2
是讓每個(gè)鍵值對(duì)顯示的時(shí)候,以縮進(jìn)兩個(gè)字符對(duì)齊。這樣的視覺效果好多了。
對(duì)于字典,json會(huì)假設(shè)key是字符串(字典中的任何非字符串key都會(huì)在編碼時(shí)轉(zhuǎn)換為字符串),要符合JSON規(guī)范,應(yīng)該只對(duì)python列表和字典進(jìn)行編碼。此外,在WEB應(yīng)用中,把最頂層對(duì)象定義為字典是一種標(biāo)準(zhǔn)做法。
大json字符串
如果數(shù)據(jù)不是很大,上面的操作足夠了。但是,上面操作是將數(shù)據(jù)都讀入內(nèi)存,如果太大就不行了。把數(shù)據(jù)放入文件,你可以使用 json.dump() 和 json.load() 來編碼和解碼JSON。
dump功能
# 將數(shù)據(jù)通過特殊的形式轉(zhuǎn)換為所有程序語言都認(rèn)識(shí)的字符串,并寫入文件
>>> with open('tmp.json', 'w') as f:
... json.dump(data_j, f)
...
> cat tmp.json
{"a": "aaa", "c": [{"c2": "cc2", "c1": "cc1"}], "b": "bbb"}
load功能
>>> with open('tmp.json', 'r') as f:
... data = json.load(f)
...
>>> print data
{u'a': u'aaa', u'c': [{u'c2': u'cc2', u'c1': u'cc1'}], u'b': u'bbb'}
- 從數(shù)據(jù)文件中讀取數(shù)據(jù),并將json編碼的字符串轉(zhuǎn)換為python的數(shù)據(jù)結(jié)構(gòu)