python接口自動化38-jsonpath提取接口返回值


前言

接口返回的json數據,需要取值后斷言,本篇使用jsonpath來提取接口返回的數據

接口返回數據

接口返回一個 json 類型的數據,以下數據是很常見的一種數據結構

{
	"code": 0,
	"msg": "success!",
	"data": [{
		"id": 154,
		"create_time": "2021-01-20 22:38:16",
		"update_time": "2021-01-20 22:38:16",
		"goodsname": "《selenium入門到精通到放棄》",
		"goodscode": "sp_210001",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 20.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 1,
		"create_time": "2021-01-17 15:14:25",
		"update_time": "2021-01-20 22:21:51",
		"goodsname": "《jmeter 入門到精通》",
		"goodscode": "sp_100049",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 100.0,
		"stock": 1,
		"goodsgroupid": 1,
		"goodsstatus": 1
	}, {
		"id": 150,
		"create_time": "2021-01-19 23:43:47",
		"update_time": "2021-01-19 23:43:47",
		"goodsname": "《cypress 入門到精通》",
		"goodscode": "sp_10002232",
		"merchantid": "1000122",
		"merchantname": "悠悠學堂",
		"goodsprice": 49.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 148,
		"create_time": "2021-01-19 23:42:20",
		"update_time": "2021-01-19 23:42:20",
		"goodsname": "《appium 入門到精通》",
		"goodscode": "sp_426001",
		"merchantid": "42601",
		"merchantname": "悠悠學堂",
		"goodsprice": 99.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 147,
		"create_time": "2021-01-19 22:22:41",
		"update_time": "2021-01-19 22:22:41",
		"goodsname": "《pytest 入門到精通》",
		"goodscode": "sp_100119",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 10.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}]
}

通過.取子節點

關於jsonpath的入門基礎可以查看前面這篇https://www.cnblogs.com/yoyoketang/p/13216829.html

相關語法可以參考下表

Xpath JSONPath 描述
/ $ 跟節點
. @ 現行節點
/ . or [] 取子節點
.. n/a 取父節點 JsonPath不支持
// .. 相對節點 就是不管位置,選擇所有符合條件的條件
* * 匹配所有元素節點
[] [] 迭代器標示(可以在里面做簡單的迭代操作,如數組下標,根據內容選值等)
&#124 [,] 支持迭代器中做多選
[] ?() 支持過濾操作
n/a () 支持表達式計算
() n/a 分組,JsonPath不支持
import jsonpath

s = {
	"code": 0,
	"msg": "success!",
	"data": [{
		"id": 154,
		"create_time": "2021-01-20 22:38:16",
		"update_time": "2021-01-20 22:38:16",
		"goodsname": "《selenium入門到精通到放棄》",
		"goodscode": "sp_210001",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 20.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 1,
		"create_time": "2021-01-17 15:14:25",
		"update_time": "2021-01-20 22:21:51",
		"goodsname": "《jmeter 入門到精通》",
		"goodscode": "sp_100049",
		"merchantid": "10001",
		"merchantname": "悠悠學堂",
		"goodsprice": 100.0,
		"stock": 1,
		"goodsgroupid": 1,
		"goodsstatus": 1
	}, {
		"id": 150,
		"create_time": "2021-01-19 23:43:47",
		"update_time": "2021-01-19 23:43:47",
		"goodsname": "《cypress 入門到精通》",
		"goodscode": "sp_10002232",
		"merchantid": "1000122",
		"merchantname": "悠悠學堂",
		"goodsprice": 49.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 148,
		"create_time": "2021-01-19 23:42:20",
		"update_time": "2021-01-19 23:42:20",
		"goodsname": "《appium 入門到精通》",
		"goodscode": "sp_426001",
		"merchantid": "42601",
		"merchantname": "悠悠學堂",
		"goodsprice": 99.9,
		"stock": 100,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}, {
		"id": 147,
		"create_time": "2021-01-19 22:22:41",
		"update_time": "2021-01-19 22:22:41",
		"goodsname": "《pytest 入門到精通》",
		"goodscode": "sp_100119",
		"merchantid": "",
		"merchantname": "",
		"goodsprice": 10.0,
		"stock": 0,
		"goodsgroupid": 0,
		"goodsstatus": 1
	}]
}

code = jsonpath.jsonpath(s, '$.code')
print(code)   # 輸出結果 [0]
msg = jsonpath.jsonpath(s, '$.msg')
print(msg)   # 輸出結果 ['success!']
names = jsonpath.jsonpath(s, '$..goodscode')
print(names)   # 輸出結果 ['sp_210001', 'sp_100049', 'sp_10002232', 'sp_426001', 'sp_100119']
no = jsonpath.jsonpath(s, '$..yoyo')
print(no)   # 找不到是結果是 False

$. 是取子節點,如果不在當前節點,可以用 $.. 相對節點取值,取出所有的子孫節點符合的值

list取值

1.根據下標取出data里面的第一條數據,下標從 0 開始計算

data1 = jsonpath.jsonpath(s, '$.data[0]')
print(data1)

# 返回
[{'id': 154, 'create_time': '2021-01-20 22:38:16', 'update_time': '2021-01-20 22:38:16', 'goodsname': '《selenium入門到精通到放棄》', 'goodscode': 'sp_210001', 'merchantid': '', 'merchantname': '', 'goodsprice': 0.0, 'stock': 0, 'goodsgroupid': 0, 'goodsstatus': 1}]

2.取出data下第1條數據的goodsname

data2 = jsonpath.jsonpath(s, '$.data[0].goodsname')
print(data2)

# ['《selenium入門到精通到放棄》']

3.取出data的前面2條數據,可以用list的切片取值[:2]

data3 = jsonpath.jsonpath(s, '$.data[:2]')
print(data3)

4.取出data的后面2條數據,用list切片取值[-2:]

data4 = jsonpath.jsonpath(s, '$.data[-2:]')
print(data4)

5.取出data的倒數第2條數據,這里不支持[-2]索引,但是可以用切片[-2:-1]

data5 = jsonpath.jsonpath(s, '$.data[-2:-1]')
print(data5)

6.取出第 1 條和第 3 條數據,多個取值可以用逗號隔開[0,2]

data6 = jsonpath.jsonpath(s, '$.data[0,2]')
print(data6)

?()過濾器運算符

過濾器是用於篩選數組的邏輯表達式。一個典型的過濾器將是 [?(@.age > 18)] ,其中@表示正在處理的當前項目。
可以使用邏輯運算符&& 和 ||創建更復雜的過濾器。 字符串文字必須用單引號或雙引號括起來 ([?(@.name == 'yoyo')] 或者 [?(@.name== "yoyo")]).

操作符 描述
== left等於right(注意1不等於'1')
!= 不等於
< 小於
<= 小於等於
> 大於
>= 大於等於
=~ 匹配正則表達式[?(@.name =~ /foo.*?/i)]
in 左邊存在於右邊 [?(@.size in ['S', 'M'])]
nin 左邊不存在於右邊
size (數組或字符串)長度
empty (數組或字符串)為空

?()過濾表達式的使用

?()過濾表達式。 表達式必須求值為一個布爾值,表達式一般結合@獲取當前節點來過濾

1.找出商品價格大於30的全部商品信息

# 價格大於30的
data1 = jsonpath.jsonpath(s, '$.data[?(@.goodsprice > 20)]')
print(data1)

# 價格大於30的goodscode
goodscodes = jsonpath.jsonpath(s, '$.data[?(@.goodsprice > 20)].goodscode')
print(goodscodes)   # ['sp_100049', 'sp_10002232', 'sp_426001']

# 價格大於30的goodsname
goodsnames = jsonpath.jsonpath(s, '$.data[?(@.goodsprice > 20)].goodsname')
print(goodsnames)  # ['《jmeter 入門到精通》', '《cypress 入門到精通》', '《appium 入門到精通》']

2.取出 'goodscode': 'sp_100049' 對應的 goodsname

# 取出 'goodscode': 'sp_100049' 對應的 goodsname
name2 = jsonpath.jsonpath(s, '$.data[?(@.goodscode == "sp_100049" )].goodsname')
print(name2)  # ['《jmeter 入門到精通》']

3.取出 'goodscode': 'sp_100049' 和 'goodscode': 'sp_100119' 對應的 goodsname

# in 包含在內 nin不存在
name3 = jsonpath.jsonpath(s, '$.data[?(@.goodscode in ["sp_100049", "sp_100119"])].goodsname')
print(name3)  # ['《jmeter 入門到精通》', '《pytest 入門到精通》']

備注:正則表達式過濾在python里面暫不支持


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM