摘要:我們?cè)谧鼋涌跍y(cè)試時(shí),大多數(shù)返回的都是json屬性,我們需要通過(guò)接口返回的json提取出來(lái)對(duì)應(yīng)的值,然后進(jìn)行做斷言或者提取想要的值供下一個(gè)接口進(jìn)行使用。
但是如果返回的json數(shù)據(jù)嵌套了很多層,通過(guò)查找需要的詞,就很不方便,小編今天介紹一種python的第3方庫(kù)jsonpath。
![]()
jsonpath
jsonpath是使用一種簡(jiǎn)單的方法來(lái)提取給定JSON內(nèi)容。在我們做接口測(cè)試時(shí),目前流行的數(shù)據(jù)格式就是JSON格式的,當(dāng)碰到復(fù)雜JSON格式時(shí),我們可以使用JsonPath快速提取數(shù)據(jù)或者更新數(shù)據(jù)。
安裝:pip install jsonpath。
![]()
小編先通過(guò)正常的接口,獲取一段json數(shù)據(jù)供我們進(jìn)行測(cè)試使用:
import requests
#請(qǐng)求天氣的url地址
url='http://apis.juhe.cn/simpleWeather/query'
#請(qǐng)求參數(shù)
data={
"city":"上海",
"key":"331eab8f3481f37868378fcdc76cb7cd"
#發(fā)送post請(qǐng)求
r=requests.post(url,data=data)
j=r.json()
print(j)
通過(guò)執(zhí)行后,獲取一段我們想要的json數(shù)據(jù)。
"reason":"查詢成功!",
"result":{
"city":"上海",
"realtime":{
"temperature":"23",
"humidity":"25",
"info":"多云",
"wid":"01",
"direct":"西北風(fēng)",
"power":"2級(jí)",
"aqi":"58"
},
"future":[
"date":"2023-03-15",
"temperature":"10/23℃",
"weather":"多云",
"wid":{
"day":"01",
"night":"01"
},
"direct":"西南風(fēng)轉(zhuǎn)東北風(fēng)"
},
"date":"2023-03-16",
"temperature":"9/15℃",
"weather":"多云轉(zhuǎn)小雨",
"wid":{
"day":"01",
"night":"07"
},
"direct":"東南風(fēng)"
},
"date":"2023-03-17",
"temperature":"9/13℃",
"weather":"中雨轉(zhuǎn)小雨",
"wid":{
"day":"08",
"night":"07"
},
"direct":"東南風(fēng)轉(zhuǎn)北風(fēng)"
},
"date":"2023-03-18",
"temperature":"8/15℃",
"weather":"多云",
"wid":{
"day":"01",
"night":"01"
},
"direct":"北風(fēng)轉(zhuǎn)東南風(fēng)"
},
"date":"2023-03-19",
"temperature":"12/16℃",
"weather":"晴",
"wid":{
"day":"00",
"night":"00"
},
"direct":"東南風(fēng)"
},
"error_code":0
通過(guò)下標(biāo)提取
json數(shù)據(jù)有了,那么我們先用正常提取json的方法,進(jìn)行提取3-16日的天氣信息,看看如何提取。
data=result['result']['future'][1]
print(data)
------------------------------輸出結(jié)果---------------------------
{'date':'2023-03-16','temperature':'9/15℃','weather':'多云轉(zhuǎn)小雨','wid':{'day':'01','night':'07'},'direct':'東南風(fēng)'}
可以看到我們想要提取需要找到對(duì)應(yīng)的值,然后在繼續(xù)往下一層一層的查找,如果嵌套層數(shù)過(guò)多,容易出錯(cuò),返回信息格式發(fā)生改變,這里需要修改信息。
通過(guò)jsonpath提取
同樣的json數(shù)據(jù),我們通過(guò)jsonpath進(jìn)行提取:
data=jsonpath.jsonpath(result,'$..[?(@.date=="2023-03-16")]')
print(data)
-----------------------------輸出結(jié)果----------------------------
[{'date':'2023-03-16','temperature':'9/15℃','weather':'多云轉(zhuǎn)小雨','wid':{'day':'01','night':'07'},'direct':'東南風(fēng)'}]
通過(guò)上面的內(nèi)容會(huì)發(fā)現(xiàn),我們直接通過(guò)過(guò)濾器的方式來(lái)講我們的數(shù)據(jù)取出來(lái)了。有點(diǎn)類似我們的正則表達(dá)式。
jsonpath的其他用法
上面介紹的只是jsonpath的一個(gè)用法,下面小編介紹幾種jsonpath的其他用法。
通過(guò)$獲取屬性值內(nèi)容
#直接獲取到future的內(nèi)容
data=jsonpath.jsonpath(result,'$.result.future')
data1=jsonpath.jsonpath(result,'$.reason')
print(data)
print(data1)
-----------------------------輸出結(jié)果----------------------
[[{'date':'2023-03-15','temperature':'10/23℃','weather':'多云','wid':{'day':'01','night':'01'},'direct':'西南風(fēng)轉(zhuǎn)東北風(fēng)'},{'date':'2023-03-16','temperature':'9/15℃','weather':'多云轉(zhuǎn)小雨','wid':{'day':'01','night':'07'},'direct':'東南風(fēng)'},{'date':'2023-03-17','temperature':'9/13℃','weather':'中雨轉(zhuǎn)小雨','wid':{'day':'08','night':'07'},'direct':'東南風(fēng)轉(zhuǎn)北風(fēng)'},{'date':'2023-03-18','temperature':'8/15℃','weather':'多云','wid':{'day':'01','night':'01'},'direct':'北風(fēng)轉(zhuǎn)東南風(fēng)'},{'date':'2023-03-19','temperature':'12/16℃','weather':'晴','wid':{'day':'00','night':'00'},'direct':'東南風(fēng)'}]]
['查詢成功!']
通過(guò)【*】獲取對(duì)應(yīng)值
通過(guò)上面的json值,獲取到關(guān)于date的時(shí)間值。
data=jsonpath.jsonpath(result,'$.result.future.[*].date')
print(data)
-----------------------------輸出結(jié)果----------------------
['2023-03-15','2023-03-16','2023-03-17','2023-03-18','2023-03-19']
通過(guò)切片獲取對(duì)應(yīng)值
data=jsonpath.jsonpath(result,'$..future[0,1]')
print(data)
-----------------------------輸出結(jié)果----------------------
[{'date':'2023-03-15','temperature':'10/23℃','weather':'多云','wid':{'day':'01','night':'01'},'direct':'西南風(fēng)轉(zhuǎn)東北風(fēng)'},{'date':'2023-03-16','temperature':'9/15℃','weather':'多云轉(zhuǎn)小雨','wid':{'day':'01','night':'07'},'direct':'東南風(fēng)'}]
以上只是小編簡(jiǎn)單的介紹幾種jsonpath的使用方法,具體的使用需要大家通過(guò)項(xiàng)目上進(jìn)行結(jié)合使用,這里小編在推薦一個(gè)jsonpath的調(diào)試器,我們可以通過(guò)調(diào)試器進(jìn)行查看編寫(xiě)是否正確:http://www.atoolbox.net/Tool.php?Id=792。
![]()
總結(jié)
小編通過(guò)簡(jiǎn)單的案例進(jìn)行介紹了如何通過(guò)jsonpath進(jìn)行提取json數(shù)值,方面我們?cè)谧鼋涌跍y(cè)試對(duì)于json的數(shù)據(jù)進(jìn)行解析,文章中沒(méi)有太多的知識(shí)點(diǎn),主要是熟能生巧,經(jīng)常使用,這樣在項(xiàng)目中才能靈活運(yùn)用。感謝您的閱讀,希望對(duì)您有所幫助。
最后:在我的V:atstudy-js,可以免費(fèi)領(lǐng)取一份10G軟件測(cè)試工程師面試寶典文檔資料。以及相對(duì)應(yīng)的視頻學(xué)習(xí)教程免費(fèi)分享!其中包括了有基礎(chǔ)知識(shí)、Linux必備、Shell、互聯(lián)網(wǎng)程序原理、Mysql數(shù)據(jù)庫(kù)、抓包工具專題、接口測(cè)試工具、測(cè)試進(jìn)階-Python編程、Web自動(dòng)化測(cè)試、APP自動(dòng)化測(cè)試、接口自動(dòng)化測(cè)試、測(cè)試高級(jí)持續(xù)集成、測(cè)試架構(gòu)開(kāi)發(fā)測(cè)試框架、性能測(cè)試、安全測(cè)試等。
![]()
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.