1. 程式人生 > 實用技巧 >python介面自動化(三十一) json解析神器jsonpath

python介面自動化(三十一) json解析神器jsonpath

前言

做介面測試的時候,大部分情況下返回的是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)

 執行結果

這樣就可以不用管層級也能取值了。