溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python怎么解析JSON

發(fā)布時(shí)間:2022-01-26 09:46:04 來(lái)源:億速云 閱讀:161 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“python怎么解析JSON”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“python怎么解析JSON”文章吧。

簡(jiǎn)介

JSON模塊是python內(nèi)置的用來(lái)進(jìn)行python對(duì)象序列化和反序列化的模塊。

 序列化,指將python對(duì)象轉(zhuǎn)換為json格式的數(shù)據(jù)流,反序列化則是將json格式的數(shù)據(jù)流轉(zhuǎn)換為python對(duì)象。

該模塊中常用的方法有以下四個(gè):

  • json.dump  將Python對(duì)象序列化為Json格式的數(shù)據(jù)流并寫入文件類型的對(duì)象中

  • json.dumps  將Python對(duì)象序列化為Json格式的字符串

  • json.load  從文件類型的對(duì)象中讀取Json格式的數(shù)據(jù)并反序列化成Python對(duì)象

  • json.loads  將包含Json格式數(shù)據(jù)的字符串反序列化成Python對(duì)象

 兩個(gè)dump函數(shù)是將python對(duì)象轉(zhuǎn)換為json,可以理解為編碼(類似demjson的encode函數(shù)),兩個(gè)load函數(shù)是將json轉(zhuǎn)換為python對(duì)象,可以理解為JSON解析(類似demjson的code函數(shù))。因?yàn)閮蓚€(gè)dump和兩個(gè)load的功能相似,所以小編只介紹其中一個(gè)(介紹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ù)(這是一個(gè)對(duì)象),其他參數(shù)為可選參數(shù),下表是該函數(shù)的所有參數(shù)的作用:

 參數(shù) 作用
 obj(必選項(xiàng)) 要序列化的python對(duì)象
 skipkeys=False 是否跳過(guò)要序列化的對(duì)象中字典元素的key不是基本類型的數(shù)據(jù);
如果為True,則跳過(guò),如果為False,將拋出TypeError異常。
 ensure_ascii=True 是否將要序列化的對(duì)象中的字符串中的非ascii字符進(jìn)行轉(zhuǎn)義。

如果該參數(shù)為True,則將字符串中的非ascii字符轉(zhuǎn)義成unicode字符串,否則,將不會(huì)進(jìn)行轉(zhuǎn)義。

 check_circular=True 是否進(jìn)行容器類型的循環(huán)引用檢查。

如果該參數(shù)設(shè)置為False,則不進(jìn)行檢查,但是可能會(huì)引發(fā)OverflowError或更嚴(yán)重的情況。

如果該參數(shù)設(shè)置為True,則將進(jìn)行容器類型的循環(huán)引用檢查,并在發(fā)現(xiàn)循環(huán)引用時(shí)拋出異常。

 allow_nan=True 是否允許序列化超出范圍的float類型的值(如float('inf')、float('-inf')float('nan'))。

如果該參數(shù)設(shè)置為True,則上面列出的那些值將依次使用JavaScript中等價(jià)的值(Infinity、-InfinityNaN)來(lái)進(jìn) 行替代;

如果該參數(shù)設(shè)置為False,并且要序列化的對(duì)象中出現(xiàn)了那些超出范圍的值,則將引發(fā)ValueError異常。

 indent=None 是否在數(shù)組元素和對(duì)象成員前增加縮進(jìn)以便使格式更加美觀。

如果該參數(shù)設(shè)置為大于等于1的整數(shù),則添加換行符和對(duì)應(yīng)數(shù)量的空格表示縮進(jìn),如果設(shè)置為0,則表示只添加換行符,如果設(shè)置為None,則表示無(wú)縮進(jìn)。

 separators=None 設(shè)置Json中各項(xiàng)之間、對(duì)象的鍵和值之間的分隔符;

該參數(shù)必須是一個(gè)2元組,元組第一個(gè)元素表示Json數(shù)據(jù)中各項(xiàng)之間的分隔符,元組的第二個(gè)元素表示Json對(duì)象的鍵和值之間的分隔符。默認(rèn)的分隔符為(’,’, ‘:’)

 default=None 指定一個(gè)函數(shù),用來(lái)將不可進(jìn)行序列化的Python對(duì)象轉(zhuǎn)化為可序列化的Python對(duì)象。
 cls=None 指定一個(gè)定制的JSONEncoder的子類(例如,重寫了.default()方法用來(lái)序列化附加的類型),指定該參數(shù)時(shí)請(qǐng)使用cls關(guān)鍵字參數(shù)。如果未指定該參數(shù),則將使用默認(rèn)的JSONEncoder
 sort_keys=False 是否要將對(duì)象中字典元素按照key進(jìn)行排序。

默認(rèn)為False,即不進(jìn)行排序,若指定為True,則會(huì)進(jìn)行排序。

舉個(gè)簡(jiǎn)單的例子(以下是小編在某篇文章中的例子,里面就用到了json.dumps方法):

from flask import Flask
import json

app = Flask(__name__)


@app.route('/hello')  # 規(guī)定url,當(dāng)請(qǐng)求的url為/hello時(shí)執(zhí)行注解下的函數(shù)
def hello_world():
    data = {
        'no': 1,
        'name': 'W3CSchool',
        'url': 'http://www.kemok4.com'
    }
    # 在python中,與json對(duì)應(yīng)的數(shù)據(jù)格式是字典,所以我們這邊創(chuàng)建一個(gè)字典用來(lái)存儲(chǔ)數(shù)據(jù)與返回
    print(type(data))
    # 打印,確定數(shù)據(jù)類型是字典

    json_str = json.dumps(data)
    # 使用dumps將字典類型轉(zhuǎn)換為字符串,這樣才能通過(guò)http協(xié)議返回
    # json在傳輸時(shí)是以字符串進(jìn)行傳輸?shù)?
    return json_str  # 使用flask,可以直接用return返回這個(gè)字符串,即可將json返回


if __name__ == '__main__':
    app.run() # 運(yùn)行這個(gè)flask項(xiàng)目

python對(duì)象轉(zhuǎn)化為JSON字符串的時(shí)候遵循以下轉(zhuǎn)換規(guī)則:

PythonJson
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

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ù)(這是一個(gè)字符串),其他參數(shù)為可選參數(shù),下表是該函數(shù)的所有參數(shù)的作用:

 參數(shù) 作用
 s(必選項(xiàng)) 要反序列化的JSON字符串
encoding=None
 該參數(shù)已棄用,將會(huì)被忽略
cls=None
 指定一個(gè)定制的JsonDecoder子類,以便實(shí)現(xiàn)特定的反序列化需求;
object_hook=None

接受一個(gè)可調(diào)用對(duì)象,用于處理解碼后生成的Python對(duì)象中dict類型的值。

注意,這個(gè)處理過(guò)程是遞歸進(jìn)行的,即返回的Python對(duì)象內(nèi)部所有的字典結(jié)構(gòu)都將被這個(gè)方法處理

 parse_float=None

用于處理解碼后的Python對(duì)象中的float類型的值。

 parse_int=None 接受一個(gè)可調(diào)用對(duì)象,用于處理解碼后的Python對(duì)象中的int類型的值。
 parse_constant=None接受一個(gè)可調(diào)用對(duì)象,用于解碼時(shí)對(duì)Infinity、-Infinity、NaN或其他非法的Json數(shù)值的處理。
 object_parse_hook=None 如果指定了該參數(shù)并且設(shè)置為一個(gè)可調(diào)用對(duì)象,那么Json對(duì)象將被解碼成一個(gè)元素為二元組的列表,二元組的兩個(gè)元素分別為Json對(duì)象中的鍵值對(duì)的鍵和值,并且列表中元素的順序與Json對(duì)象中鍵值對(duì)的順序一致。

舉個(gè)簡(jiǎn)單的例子(以下是小編在某篇文章中的例子,里面就用到了json.loads方法,而且剛好和上一篇文章是姊妹篇,不過(guò)雖然是姊妹篇,但并不是同一個(gè)項(xiàng)目,也就是說(shuō)JSON數(shù)據(jù)不是找上一個(gè)項(xiàng)目請(qǐng)求的):

import requests
import json

response = requests.get('http://www.kuaidi100.com/query?type=ems&postid=111111111111')
# 使用request請(qǐng)求一個(gè)json,這里的快遞單號(hào)是小編隨便編寫的
print(response)
print(type(response))
# 打印后發(fā)現(xiàn)這是一個(gè)對(duì)象
response = response.text
# 使用requests的的text方法取出響應(yīng)的文本
print(response)
print(type(response))
# 打印后發(fā)現(xiàn)是個(gè)字符串(JSON在傳輸?shù)臅r(shí)候是以字符串進(jìn)行傳輸?shù)模?
response = json.loads(response)
# 使用JSON模塊的loads方法,可以將這個(gè)字符串進(jìn)行編碼,
print(response)
print(type(response))
# 打印結(jié)果,發(fā)現(xiàn)是字典(JSON對(duì)應(yīng)JavaScript的對(duì)象,對(duì)應(yīng)python的字典,對(duì)應(yīng)java的map)
response = json.dumps(response)
# 使用JSON的的dumps方法,可以把字典轉(zhuǎn)化為字符串(JSON的傳輸是以字符串傳輸?shù)?,?
print(response)
print(type(response))

與序列化的過(guò)程類似,JSON轉(zhuǎn)化為python對(duì)象也遵循一定的規(guī)則:

JsonPython
objectdict
arraylist
stringstr
number(int)int
number(real)float
trueTrue
falseFalse
nullNone

以上就是關(guān)于“python怎么解析JSON”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI