小編最近在整理網(wǎng)站的JSON教程的時候,發(fā)現(xiàn)JSON教程中python解析JSON的相關(guān)內(nèi)容比較老舊,翻閱了python教程發(fā)現(xiàn)python教程也比較老舊,在python2.6版本中JSON模塊已經(jīng)變成了python內(nèi)置模塊了,而兩本手冊介紹的還是demjson模塊的方法。所以今天小編整理了一遍python內(nèi)置的JSON模塊的使用方法介紹,希望能給各位小伙伴帶來一點幫助。
簡介
JSON模塊是python內(nèi)置的用來進行python對象序列化和反序列化的模塊。
序列化,指將python對象轉(zhuǎn)換為json格式的數(shù)據(jù)流,反序列化則是將json格式的數(shù)據(jù)流轉(zhuǎn)換為python對象。
該模塊中常用的方法有以下四個:
- ?
json.dump
? 將Python對象序列化為Json格式的數(shù)據(jù)流并寫入文件類型的對象中
- ?
json.dumps
? 將Python對象序列化為Json格式的字符串
- ?
json.load
? 從文件類型的對象中讀取Json格式的數(shù)據(jù)并反序列化成Python對象
- ?
json.loads
? 將包含Json格式數(shù)據(jù)的字符串反序列化成Python對象
兩個dump函數(shù)是將python對象轉(zhuǎn)換為json,可以理解為編碼(類似demjson的encode函數(shù)),兩個load函數(shù)是將json轉(zhuǎn)換為python對象,可以理解為JSON解析(類似demjson的code函數(shù))。因為兩個dump和兩個load的功能相似,所以小編只介紹其中一個(介紹JSON格式數(shù)據(jù)的字符串的編碼與解析,也就是dumps和loads函數(shù))。
json.dumps()
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 ?(必選項) |
要序列化的python對象 | |||
? skipkeys=False ? |
是否跳過要序列化的對象中字典元素的key不是基本類型的數(shù)據(jù);
如果為 True ,則跳過,如果為
False ,將拋出
TypeError 異常。
|
|||
?ensure_ascii=True ? |
是否將要序列化的對象中的字符串中的非ascii字符進行轉(zhuǎn)義。 | |||
?check_circular=True ? |
是否進行容器類型的循環(huán)引用檢查。 | |||
?allow_nan=True ? |
是否允許序列化超出范圍的float
類型的值(如float('inf')
、float('-inf')
、float('nan')
)。
|
|||
?indent=None ? |
是否在數(shù)組元素和對象成員前增加縮進以便使格式更加美觀。 | |||
?separators=None ? |
設(shè)置Json中各項之間、對象的鍵和值之間的分隔符; | |||
?default=None ? |
指定一個函數(shù),用來將不可進行序列化的Python對象轉(zhuǎn)化為可序列化的Python對象。 | |||
? cls=None ? |
指定一個定制的JSONEncoder
的子類(例如,重寫了.default()
方法用來序列化附加的類型),指定該參數(shù)時請使用cls
關(guān)鍵字參數(shù)。如果未指定該參數(shù),則將使用默認的JSONEncoder
。
|
|||
? sort_keys=False ? |
是否要將對象中字典元素按照key進行排序。 |
舉個簡單的例子(以下是小編在某篇文章中的例子,里面就用到了json.dumps方法):
from flask import Flask
import json
app = Flask(__name__)
@app.route('/hello') # 規(guī)定url,當(dāng)請求的url為/hello時執(zhí)行注解下的函數(shù)
def hello_world():
data = {
'no': 1,
'name': 'W3CSchool',
'url': 'http://m.hgci.cn'
}
# 在python中,與json對應(yīng)的數(shù)據(jù)格式是字典,所以我們這邊創(chuàng)建一個字典用來存儲數(shù)據(jù)與返回
print(type(data))
# 打印,確定數(shù)據(jù)類型是字典
json_str = json.dumps(data)
# 使用dumps將字典類型轉(zhuǎn)換為字符串,這樣才能通過http協(xié)議返回
# json在傳輸時是以字符串進行傳輸?shù)? return json_str # 使用flask,可以直接用return返回這個字符串,即可將json返回
if __name__ == '__main__':
app.run() # 運行這個flask項目
python對象轉(zhuǎn)化為JSON字符串的時候遵循以下轉(zhuǎn)換規(guī)則:
Python | Json |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
json.loads()
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 ?(必選項) |
要反序列化的JSON字符串 | |||
encoding=None
|
該參數(shù)已棄用,將會被忽略 | |||
cls=None
|
指定一個定制的JsonDecoder
子類,以便實現(xiàn)特定的反序列化需求;
|
|||
object_hook=None
|
||||
? parse_float=None ? |
用于處理解碼后的Python對象中的 |
|||
?parse_int=None ? |
接受一個可調(diào)用對象,用于處理解碼后的Python對象中的int
類型的值。
|
|||
? parse_constant=None ? |
接受一個可調(diào)用對象,用于解碼時對
Infinity 、
-Infinity 、
NaN 或其他非法的Json數(shù)值的處理。
|
|||
?object_parse_hook=None ? |
如果指定了該參數(shù)并且設(shè)置為一個可調(diào)用對象,那么Json對象將被解碼成一個元素為二元組的列表,二元組的兩個元素分別為Json對象中的鍵值對的鍵和值,并且列表中元素的順序與Json對象中鍵值對的順序一致。 |
舉個簡單的例子(以下是小編在某篇文章中的例子,里面就用到了json.loads方法,而且剛好和上一篇文章是姊妹篇,不過雖然是姊妹篇,但并不是同一個項目,也就是說JSON數(shù)據(jù)不是找上一個項目請求的):
import requests
import json
response = requests.get('http://www.kuaidi100.com/query?type=ems&postid=111111111111')
# 使用request請求一個json,這里的快遞單號是小編隨便編寫的
print(response)
print(type(response))
# 打印后發(fā)現(xiàn)這是一個對象
response = response.text
# 使用requests的的text方法取出響應(yīng)的文本
print(response)
print(type(response))
# 打印后發(fā)現(xiàn)是個字符串(JSON在傳輸?shù)臅r候是以字符串進行傳輸?shù)模?response = json.loads(response)
# 使用JSON模塊的loads方法,可以將這個字符串進行編碼,
print(response)
print(type(response))
# 打印結(jié)果,發(fā)現(xiàn)是字典(JSON對應(yīng)JavaScript的對象,對應(yīng)python的字典,對應(yīng)java的map)
response = json.dumps(response)
# 使用JSON的的dumps方法,可以把字典轉(zhuǎn)化為字符串(JSON的傳輸是以字符串傳輸?shù)?,?print(response)
print(type(response))
與序列化的過程類似,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 |
小結(jié)
以上就是JSON模塊的詳細介紹了,其他語言的JSON編碼與解析小編也會在后續(xù)的文章中繼續(xù)更新,希望小伙伴們持續(xù)關(guān)注W3Cschool。