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