json介紹
說明:JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式吨艇。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集立肘。 JSON采用完全獨立于語言的文本格式掷邦,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(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):
- 名稱/值”對的集合(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)。
python標(biāo)準(zhǔn)庫中有json模塊誓琼,主要是執(zhí)行序列化和反序列化功能:
序列化:encoding检激,把一個python對象編碼轉(zhuǎn)化成json字符串肴捉,json.dumps()
反序列化:decoding,把json格式字符串解碼轉(zhuǎn)換為python數(shù)據(jù)對象叔收,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的操作是比較簡單的齿穗,請注意觀察data和data_json的不同——lang的value從元組變成了列表,還有不同:
>>> type(data_json)
<type 'str'>
>>> type(data)
<type 'list'>
將python對象轉(zhuǎn)化為json類型饺律,是按照下表所示對照關(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的過程也像上面一樣簡單:
>>> new_data = json.loads(data_json)
>>> new_data
[{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]
需要注意的是窃页,解碼之后,并沒有將元組還原复濒。
解碼的數(shù)據(jù)類型對應(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都不是很長脖卖,還能湊合閱讀,如果很長了巧颈,閱讀就有難度了畦木。所以,json的dumps()提供了可選參數(shù)砸泛,利用它們能在輸出上對人更友好(這對機器是無所謂的)十籍。
>>> 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
是讓每個鍵值對顯示的時候唇礁,以縮進兩個字符對齊妓雾。這樣的視覺效果好多了。
對于字典垒迂,json會假設(shè)key是字符串(字典中的任何非字符串key都會在編碼時轉(zhuǎn)換為字符串)械姻,要符合JSON規(guī)范,應(yīng)該只對python列表和字典進行編碼机断。此外楷拳,在WEB應(yīng)用中,把最頂層對象定義為字典是一種標(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)識的字符串,并寫入文件
>>> 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)