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