python接口自动化(三十一) json解析神器jsonpath
作者:互联网
前言
做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言。
当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间,于是就有了jsonpath解析库,专门解决json路径深,取值难的问题。
字典取值
对接口返回的json,转成dict类型,通过字典键值对取值
#返回结果,下面是dict result = { "code": 0, "data": [ { "age": 20, "create_time": "2019-09-15", "id": 1, "mail": "283340479@qq.com", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "123445@qq.com", "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": "283340479@qq.com", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "123445@qq.com", "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": "283340479@qq.com", "name": "xiaohua", "sex": "M" }, { "age": 21, "create_time": "2019-09-16", "id": 2, "mail": "123445@qq.com", "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)
运行结果
这样就可以不用管层级也能取值了。
标签:xiaohua,name,python,json,jsonpath,result,取值 来源: https://www.cnblogs.com/canglongdao/p/13457817.html