python之jsonpath的简单使用
1.使用场景
有时候一个接口可能不满足业务的整个流程逻辑,需要多个接口配合使用,简单的案例如:B 接口的成功调用依赖于 A 接口,需要在 A 接口的响应数据(response)中拿到需要的字段,在调用 B 接口的时候,传递给 B 接口作为 B 接口请求参数,拿到后续响应的响应数据。
举例:
A接口登录成功之后,得到response如下:
{'code':1,'msg':'登录成功',"data":{"id":123,"token":"HJdnjajkajjmhhhfd#3ll"}}
B接口要进行充值需要拿到A接口的id和token值作为B接口的请求数据,此时就需要使用到jsonpath,当然也有其他方式。
2.介绍jsonpath
2.1安装:pip install jsonpath,官网:https://goessner.net/articles/JsonPath/
2.2 jsonpath的运算符

存在以下数据:
data = { "store":{
"book":[
{ "category":"参考",
"author":"Nigel Rees",
"title":"世纪风俗",
"price":8.95
},
{ "category":"小说",
"author":"Evelyn Waugh",
"title":"荣誉剑",
"price":12.99
},
{ "category":"小说",
"author":"Herman Melville",
"title":"Moby Dick",
"isbn":"0-553-21311-3",
"price":8.99
},
{ "category":"小说",book
"author":"JRR Tolkien",
"title":"指环王",
"isbn":"0-395-19395-8",
"price":22.99
}
],
"bicycle":{
"color":"red",
"price":19.95
}
}
}
| 获取store中所有的book的author | $.store.book[*].author |
| 获取所有的author | $..author |
| 获取store下的所有price | $.store..price |
| 获取book下的第三个值 | $..book[2] |
| 获取book下的倒数第一个值 |
$..book[(@.length-1)] $..book[-1:] |
| 获取book下的前两个值 | $..book[0,1] |
| 获取book中包含isbn字段 |
$..book[?(@.isbn)] |
|
获取book中价格小于10 |
$..book[?(@.price<10)] |
2.3 python中使用方法
from jsonpath import jsonpath jsonpath(data, '$..author')
2.4 使用jsonpath封装函数,提取到需要传给下一个接口的数据
将需要传给下个接口的参数放入到Excel表格中extract列中,使用列表存放起来,如:[["normal_mobile_phone","$..mobile_phone"]]
def __extract_data_from_json(self):
try:
# 将Excel表格中的数据转换为python对象
rules = json.loads(self.case['extract'])
except Exception as e:
logger.exception('用例【{}】的extract字段数据:{}格式不正确'.format(self.case['title'], self.case['extract']))
raise e
# 循环取值
for rule in rules:
name = rule[0] # 参数名
exp = rule[1] # jsonpath表达式
value = jsonpath(self.response.json(), exp) # 在响应数据中去提取数据
if value:
# 注意:如果提取到了值是一个列表格式
# 如果提取到了数据就绑定到类属性中
setattr(self.__class__, name, value[0])
else:
logger.exception('用例【{}】的提取表达式{}提取不到数据'.format(self.case['title'], self.case['extract']))
def __extract_data(self):
if self.case.get('extract'):
if self.case['res_type'].lower() == 'json':
self.__extract_data_from_json()
本文来自博客园,作者:大头~~,转载请注明原文链接:https://www.cnblogs.com/xiaoying-guo/p/15149433.html

浙公网安备 33010602011771号