前言
做接口测试的时候,大部分情况下返回的是json数据,我们需要对返回的json断言。
当返回的数据量比较大,并且嵌套的层级很深的时候,很多小伙伴不会取值,往往在返回结果取值上浪费很多时间。一直在寻找一个方便json的库,今天找到了。于是就有了 jsonpath 解析库,专门解决 json 路径深,取值难的问题。
字典取值
对接口返回的接口,转成 dict 类型,通过字典键值对取值
# QQ交流群:902061117
# 返回结果,这里是dict
1 result = { 2 "code": 0, 3 "data": [ 4 { 5 "age": 35, 6 "create_time": "2020-07-01", 7 "id": 1, 8 "mail": "xxxxxx@qq.com", 9 "name": "码上开始", 10 "sex": "Man" 11 }, 12 { 13 "age": 21, 14 "create_time": "2016-12-30", 15 "id": 2, 16 "mail": "yyyyyy@qq.com", 17 "name": "糖糖", 18 "sex": "gril" 19 } 20 ], 21 "msg": "success!" 22 } 23 24 # 字典取值断言 25 assert result["code"] == 0 26 assert result["msg"] == "success!" 27 assert result["data"][0]["name"] == "码上开始"
当层级越来越深的时候,会发现取值变得困难,并且list里面的内容往往不知道是第几个
比如我想判断返回的结果里面有没有 "name": "码上开始"
并且你不知道它是 data
列表中的第几个,这种情况断言就写的很复杂了
jsonpath 解析
接下来讲一个非常强大并且方便的 jsonpath 专门用于 json 解析,解决路径深的老大难问题!
先安装依赖包
jsonpath是第三方模块,想要额外安装
pip install jsonpath
result = jsonpath(obj, 'jsonpath语法规则字符串')
学习jsonpath 不得不提到xpath,这两者之间的语法是差不多
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 跟节点 |
. | @ | 现行节点 |
/ | . or [] | 取子节点 |
.. | n/a | 取父节点 JsonPath不支持 |
// | .. | 相对节点 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
[] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选 |
[] | ?() | 支持过滤操作 |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JsonPath不支持 |
$
是查找的根节点,传参数是python的dict 类型,当查找到的时候返回一个list结果,查找失败的时候返回 False.
import jsonpath # QQ交流群:902061117 result = { "code": 0, "data": [ { "age": 35, "create_time": "2020-05-15", "id": 1, "mail": "xxxxxx@qq.com", "name": "码上开始", "sex": "Man" }, { "age": 3, "create_time": "2016-12-30", "id": 2, "mail": "yyyy@qq.com", "name": "糖糖", "sex": "gril" } ], "msg": "success!" } msg = jsonpath.jsonpath(result, '$.msg') print(msg) # 输出结果 ['success!'] names = jsonpath.jsonpath(result, '$..name') print(names) # 输出结果 ['码上开始', '糖糖'] no = jsonpath.jsonpath(result, '$..码上开始') print(no) # 找不到是结果是 False
如果文章对你有帮助,麻烦点个赞,谢谢你的支持。
如果对软件测试、接口测试、自动化测试、性能测试、持续集成、面试经验交流。感兴趣可以进到902061117,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。