Pthon JSON

  JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它使得人們很容易的進行閱讀和編寫。同時也方便了機器進行解析和生成。 JSON採用完全獨立於程序語言的文本格式,但是也使用了類C語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。

  JSON簡單說就是javascript中的對象和數組,所以這兩種結構就是對象和數組兩種結構,通過這兩種結構可以表示各種複雜的結構。

  • 對象:對象在js中表示爲“{}”括起來的內容,數據結構爲 {key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key爲對象的屬性,value爲對應的屬性值,所以很容易理解,取值方法爲 對象.key 獲取屬性值,這個屬性值的類型可以是 數字、字符串、數組、對象幾種。

  • 數組:數組在js中是中括號“[]”括起來的內容,數據結構爲 ["java","javascript","vb",...],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是 數字、字符串、數組、對象幾種。

  Python的json模塊提供了一種很簡單的方式來編碼和解碼JSON數據。 其中兩個主要的函數是 json.dumps() 和 json.loads() ,下面舉例看Ptython是如何通過方法進行編碼解碼的:

import json
obj = [[1, 2, 3], 123, 123.123, 'abc', {'key1': (1, 2, 3), 'key2': (4, 5, 6)},True,False,None]
print '*****Encoding*****'
dus = json.dumps(obj)
print type(dus)
print dus
print '*****Decoding*****'
los=json.loads(dus)
print type(los)
print los

運行結果:
*****Encoding*****
<type 'str'>
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}, true, false,null]
*****Decoding*****
<type 'list'>
[[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}, True, False,None]

  從例子中可以看出json.dumps()方法返回了一個str對象,json.loads()方法返回了原始的對象;其實在JSON的編碼過程中,會存在從python原始類型向json類型的轉化過程,例子中有些數據類型進行了改變,如元組則轉換爲了列表;Python-->Json具體的轉化如下:

dict
object
list,tuple
array
str,unicode
string
int,long,float
number
Truetrue
Falsefalse
None
null

  其實在JSON的解碼過程中,會存在從json原始類型向python類型的轉化過程,例子中有些數據類型進行了改變,如字符轉換爲了Unicode;Json-->Python具體的轉化如下:

object dict
arraylist
number(int)

int,long

number(real)float
trueTrue
falseFalse
nullNone
stringUnicode

  如果你要處理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 來編碼和解碼JSON數據。如下例子:

import json
obj = [[1, 2, 3], 123, 123.123, 'abc', {'key1': (1, 2, 3), 'key2': (4, 5, 6)},True,False,None]
print '*****Encoding*****'
dus = json.dumps(obj)
print type(dus)
print dus
print '*****Decoding*****'
los=json.loads(dus)
print type(los)
print los
# Writing JSON data
with open('data.json', 'w') as f:
   json.dump(obj, f)
# Reading data back
with open('data.json', 'r') as f:
   data = json.load(f)
   
data.json文件:
[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}, true, false, null]

  從例子中可以看出:

  編碼過程,是把python對象轉換成json對象的一個過程,常用的兩個函數是dumps和dump函數。兩個函數的唯一區別就是dump把python對象轉換成json對象生成一個fp的文件流,而dumps則是生成了一個字符串;

  解碼過程,是把json對象轉換成python對象的一個過程,常用的兩個函數是loads和load函數。兩個函數的唯一區別就是load把python對象轉換成json對象生成一個fp的文件流,而loads則是生成了一個字符串;

  除了上述簡單的用法外,dump的第一個參數是對象字典,第二個參數是文件對象,可以直接將轉換後的json數據寫入文件,dumps的第一個參數是對象字典,其餘都是可選參數。dump和dumps的可選參數相同,這些參數都相當實用,如下:

  ensure_ascii 默認爲True,保證轉換後的json字符串中全部是ascii字符,非ascii字符都會被轉義。如果數據中存在中文或其他非ascii字符,最好將ensure_ascii設置爲False,保證輸出結果正常;

  indent 縮進,默認爲None,沒有縮進,設置爲正整數時,輸出的格式將按照indent指定的半角空格數縮進;

  separators 設置分隔符,默認的分隔符是(',',':'),如果需要自定義json中的分隔符,例如調整冒號前後的空格數,可以按照(item_separator, key_separator)的形式設置;

  sort_keys 默認爲False,設爲True時,輸出結果將按照字典中的key排序;

  如下例子:

import json
ject=[{"name":"測試","age":16},(2,3),1]
dus = json.dumps(ject)
ass=json.dumps(ject,ensure_ascii=False)
sor=json.dumps(ject,sort_keys=True)
ind=json.dumps(ject,sort_keys=True,indent=4)
se=json.dumps(ject,separators=(',',':'))
print ass
print dus
print sor
print ind
print se

運行結果:
[{"age": 16, "name": "測試"}, [2, 3], 1]
[{"age": 16, "name": "\u6d4b\u8bd5"}, [2, 3], 1]
[{"age": 16, "name": "\u6d4b\u8bd5"}, [2, 3], 1]
[
   {
       "age": 16,
       "name": "\u6d4b\u8bd5"
   },
   [
       2,
       3
   ],
   1
]
[{"age":16,"name":"\u6d4b\u8bd5"},[2,3],1]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章