python操作json

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.Json簡(jiǎn)介 Json,全名 JavaScript Object Notation,是一種輕量級(jí)的數(shù)據(jù)交換格式...
    herrykb閱讀 1,127評(píng)論 0 0
  • pyton review 學(xué)習(xí)指南 https://www.zhihu.com/question/29138020...
    孫小二wuk閱讀 1,064評(píng)論 0 2
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,624評(píng)論 1 118
  • 秋色 原創(chuàng)/阿蓮 才見白壁金浸綠,又遙灰墻紅染黃。 誰家小兒最無賴,一言不合就涂墻?
    阿蓮簡(jiǎn)師閱讀 325評(píng)論 5 20
  • 弟弟最近幾天已經(jīng)能趴姿坐姿轉(zhuǎn)換自如啦,七個(gè)半月進(jìn)步不小哦,而且已經(jīng)會(huì)爬很久了。
    墨藍(lán)涼語閱讀 186評(píng)論 0 0