python介面自動化(三十一) json解析神器jsonpath
阿新 • • 發佈:2020-08-08
前言
做介面測試的時候,大部分情況下返回的是json資料,我們需要對返回的json斷言。
當返回的資料量比較大,並且巢狀的層級很深的時候,很多小夥伴不會取值,往往在返回結果取值上浪費很多時間,於是就有了jsonpath解析庫,專門解決json路徑深,取值難的問題。
字典取值
對介面返回的json,轉成dict型別,通過字典鍵值對取值
#返回結果,下面是dict result = { "code": 0, "data": [ { "age": 20, "create_time": "2019-09-15", "id": 1, "mail": "[email protected]", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "[email protected]", "name": "tree", "sex": "M" } ], "msg": "success!" } assert result["code"]==0 assert result["msg"]=="success!" assert result["data"][0]["name"]=="xiaohua" assert result["data"][1]["name"]=="xiaohua"
執行結果
當層級越來越深的時候,會發現取值變得困難,並且list裡面的內容往往不知道是第幾個
比如我想判斷返回的結果連有沒有"name":"xiaohua",並且你不知道它是data列表中的第幾個,這種情況斷言就寫的很複雜了
正則取值
比如我想判斷返回的結果裡面有沒有"name":"xiaohua" 並且你不知道它是data列表中的第幾個,這種情況斷言就寫的很複雜了。
可以用萬能的正則取值,正則只能是針對字串取值,dict物件先轉json字串。
#返回結果,下面是dict import json import re result = { "code": 0, "data": [ { "age": 20, "create_time": "2019-09-15", "id": 1, "mail": "[email protected]", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "[email protected]", "name": "tree", "sex": "M" } ], "msg": "success!" } #斷言result中包含"name": "xiaohua" j=json.dumps(result) #字典轉json print(type(j)) #方法1,正則取值 rename=re.findall("name\": \"(.+?)\"",j) #rename=re.findall('"name": "(.+?)"',j) print(type(rename),rename) assert "xiaohua" in rename #方法2 直接判斷包含 #assert "\"name\": \"xiaohua\"" in j assert '"name": "xiaohua"' in j
執行結果
jsonpath解析
接下來講一個非常強大並且方便的jsonpath專門用於json解析,解決路徑深的老大難問題!
先安裝依賴包
pip install jsonpath
學習jsonpath不得不提到xpath,這兩者之間的語法是差不多的
使用示例
$是查詢的根節點,傳參就是python的dict型別,當查詢到的時候返回一個list結果,查詢失敗的時候返回False
#返回結果,下面是dict import jsonpath result = { "code": 0, "data": [ { "age": 20, "create_time": "2019-09-15", "id": 1, "mail": "[email protected]", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "[email protected]", "name": "tree", "sex": "M" } ], "msg": "success!" } c=jsonpath.jsonpath(result,'$.code') print(c) name=jsonpath.jsonpath(result,'$..name') print(name) o=jsonpath.jsonpath(result,'$..msgg') print(o)
執行結果
這樣就可以不用管層級也能取值了。