本教程將會教我們?nèi)绾问褂?nbsp;Python 編程語言編碼和解碼 JSON。
在python3中(以及python2.6版本后的python2版本)內(nèi)置了JSON模塊,無需額外安裝另外的JSON模塊。
JSON模塊是python內(nèi)置的用來進(jìn)行python對象序列化和反序列化的模塊。
序列化,指將python對象轉(zhuǎn)換為json格式的數(shù)據(jù)流,反序列化則是將json格式的數(shù)據(jù)流轉(zhuǎn)換為python對象。
該模塊中常用的方法有以下四個:
兩個dump函數(shù)是將python對象轉(zhuǎn)換為json,可以理解為編碼(類似demjson的encode函數(shù)),兩個load函數(shù)是將json轉(zhuǎn)換為python對象,可以理解為JSON解析(類似demjson的code函數(shù))。因?yàn)閮蓚€dump和兩個load的功能相似,所以小編只介紹其中一個(介紹JSON格式數(shù)據(jù)的字符串的編碼與解析,也就是dumps和loads函數(shù))。
dumps可以傳遞的參數(shù)如下:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False)
在日常使用中,更多的情況我們只傳遞必須的obj參數(shù)(這是一個對象),其他參數(shù)為可選參數(shù),下表是該函數(shù)的所有參數(shù)的作用:
參數(shù) | 作用 | |||
?obj ?(必選項(xiàng)) |
要序列化的python對象 | |||
? skipkeys=False ? |
是否跳過要序列化的對象中字典元素的key不是基本類型的數(shù)據(jù);
如果為 True ,則跳過,如果為 False ,將拋出 TypeError 異常。 |
|||
?ensure_ascii=True ? |
是否將要序列化的對象中的字符串中的非ascii字符進(jìn)行轉(zhuǎn)義。
如果該參數(shù)為 |
|||
?check_circular=True ? |
是否進(jìn)行容器類型的循環(huán)引用檢查。
如果該參數(shù)設(shè)置為 如果該參數(shù)設(shè)置為 |
|||
?allow_nan=True ? |
是否允許序列化超出范圍的float 類型的值(如float('inf') 、float('-inf') 、float('nan') )。
如果該參數(shù)設(shè)置為 如果該參數(shù)設(shè)置為 |
|||
?indent=None ? |
是否在數(shù)組元素和對象成員前增加縮進(jìn)以便使格式更加美觀。
如果該參數(shù)設(shè)置為大于等于1的整數(shù),則添加換行符和對應(yīng)數(shù)量的空格表示縮進(jìn),如果設(shè)置為 |
|||
?separators=None ? |
設(shè)置Json中各項(xiàng)之間、對象的鍵和值之間的分隔符;
該參數(shù)必須是一個2元組,元組第一個元素表示Json數(shù)據(jù)中各項(xiàng)之間的分隔符,元組的第二個元素表示Json對象的鍵和值之間的分隔符。默認(rèn)的分隔符為(’,’, ‘:’) |
|||
?default=None ? |
指定一個函數(shù),用來將不可進(jìn)行序列化的Python對象轉(zhuǎn)化為可序列化的Python對象。 | |||
? cls=None ? |
指定一個定制的JSONEncoder 的子類(例如,重寫了.default() 方法用來序列化附加的類型),指定該參數(shù)時(shí)請使用cls 關(guān)鍵字參數(shù)。如果未指定該參數(shù),則將使用默認(rèn)的JSONEncoder 。 |
|||
? sort_keys=False ? |
是否要將對象中字典元素按照key進(jìn)行排序。
默認(rèn)為 |
舉個簡單的例子:
#!/usr/bin/python3
import json
# Python 字典類型轉(zhuǎn)換為 JSON 對象
data = {
'no' : 1,
'name' : 'W3CSchool',
'url' : 'http://m.hgci.cn'
}
json_str = json.dumps(data)
print ("Python 原始數(shù)據(jù):", repr(data))
print ("JSON 對象:", json_str)
python對象轉(zhuǎn)化為JSON字符串的時(shí)候遵循以下轉(zhuǎn)換規(guī)則:
Python | Json |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
loads可以傳遞的參數(shù)如下:
json.loads(s,encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None)
在日常使用中,更多的情況我們只傳遞必須的s參數(shù)(這是一個字符串),其他參數(shù)為可選參數(shù),下表是該函數(shù)的所有參數(shù)的作用:
參數(shù) | 作用 | |||
?s ?(必選項(xiàng)) |
要反序列化的JSON字符串 | |||
encoding=None
|
該參數(shù)已棄用,將會被忽略 | |||
cls=None
|
指定一個定制的JsonDecoder 子類,以便實(shí)現(xiàn)特定的反序列化需求; |
|||
object_hook=None
|
接受一個可調(diào)用對象,用于處理解碼后生成的Python對象中? 注意,這個處理過程是遞歸進(jìn)行的,即返回的Python對象內(nèi)部所有的字典結(jié)構(gòu)都將被這個方法處理 |
|||
? parse_float=None ? |
用于處理解碼后的Python對象中的 |
|||
?parse_int=None ? |
接受一個可調(diào)用對象,用于處理解碼后的Python對象中的int 類型的值。 |
|||
? parse_constant=None ? |
接受一個可調(diào)用對象,用于解碼時(shí)對 Infinity 、 -Infinity 、 NaN 或其他非法的Json數(shù)值的處理。
|
|||
?object_parse_hook=None ? |
如果指定了該參數(shù)并且設(shè)置為一個可調(diào)用對象,那么Json對象將被解碼成一個元素為二元組的列表,二元組的兩個元素分別為Json對象中的鍵值對的鍵和值,并且列表中元素的順序與Json對象中鍵值對的順序一致。 |
舉個簡單的例子:
#!/usr/bin/python3
import json
# Python 字典類型轉(zhuǎn)換為 JSON 對象
data1 = {
'no' : 1,
'name' : 'W3CSchool',
'url' : 'http://m.hgci.cn'
}
json_str = json.dumps(data1)
print ("Python 原始數(shù)據(jù):", repr(data1))
print ("JSON 對象:", json_str)
# 將 JSON 對象轉(zhuǎn)換為 Python 字典
data2 = json.loads(json_str)
print ("data2['name']: ", data2['name'])
print ("data2['url']: ", data2['url'])
與序列化的過程類似,JSON轉(zhuǎn)化為python對象也遵循一定的規(guī)則:
Json | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
更多建議: