Json(JavaScript Object Notation)它是一種輕量級的數據交換格式,具有數據格式簡單,讀寫方便易懂等很多優點。許多主流的程式語言都在用它來進行前後端的數據傳輸,大大的簡化了伺服器和客戶端的開發工作量。相對於XML來說,更加的輕量級,更方便解析,因此許多開發者都遵循Json格式來進行數據的傳輸和交換。今天我們詳細介紹一下Python在Json的編解碼方面的知識。
json的數據格式
在json中,遵循「鍵值對」的這樣一種方式,比如:「{"name":"tom"}」,就是一個json格式的數據,json的格式歸納下來,一般有以下幾點:
對象通過鍵值對表現;鍵通過雙引號包裹,後面跟冒號「:」,然後跟該鍵的值;值可以是字符串、數字、數組等數據類型;對象與對象之間用逗號隔開;「{}」用來表達對象;「[]」用來表達數組;
我們看一個略為複雜一點的例子:
上例則是一個典型的json格式的數據,強大的Python提供了一個「json」模塊,可以方便的將各種零散的數據通過模塊的內置函數編碼形成一個json格式的數據,也可以將一個json格式的數據解碼形成自己需要的數據,非常好用,下面我們就來介紹一下。
json.dumps()
json模塊裡的dumps函數是對數據進行編碼,形成json格式的數據,我們看一下下面的例子:
通過輸出的結果很容易看出,通過dumps方法使字典轉換成為了json格式,雖然它們非常相似。其中,在dumps裡的參數「sort_keys=True」,使得輸出json後對key和value進行0~9、a~z的順序排序,如果不填,則按照無序排列。有時候,通過排序可以方便地比較json中的數據,因此,適當的排序是很有必要的。
此外,「Indent」參數表示縮進的意思,它可以使得輸出的Json看起來更加整齊好看,可讀性更強,例如:
下面列舉一下dumps()的可填參數:
skipkey:默認為False,當dict對象裡的數據不是Python的基本數據類型;(str,unicode,int,long,float,bool,None)時,當skipkey為False,就會報錯,如果skipkey為True,則可以跳過這類key;indent:如果填0或者不填,則按照一行進行列印,否則按照indent的數值顯示前面的空格(正整數形式);separators:分隔符,默認為「(',',':')」,它表示key之間用「,」隔開,key和value之間用「:」隔開;encoding:編碼格式,默認值是UTF-8;sort_keys:對key、value進行排序,默認值是False,即不排序;ensure_ascii:默認為True,如果dict對象裡含有none-ASCII的字符,則顯示\uXX的格式,如果為False,則能正常顯示出來;
json.loads()
和dumps相反,loads函數則是將json格式的數據解碼,轉換為Python字典,我們看一下下面的例子:
有時候,輸出結果遇到中文的時候,會出現編碼格式不一樣的情況,顯示出為Unicode的編碼格式,使得不易讀懂,解決辦法是添加參數「encoding」參數,即上面的改寫成這樣:d1 = json.loads(data1,encoding='utf-8')即可。
json.dump()和 json.load()
相對於上面所講的dumps和loads來說,dump和load函數的功能類似,只不過前者是用來處理字符串類型的,而後者是用於處理文件類型的,如下所示:
上例列舉出了json的四個方法:dumps()和dump()、loads()和load()的簡單使用方法,可見,Python對於json的處理相當方便,不像c++那樣(誰用誰知道)。