前言


 

  做接口测试的时候,大部分情况下返回的是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不支持

//

..

相对节点 就是不管位置,选择所有符合条件的条件

*

*

匹配所有元素节点

[]

[]

迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等)

&#124

[,]

支持迭代器中做多选

[]

?()

支持过滤操作

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

  

  如果文章对你有帮助,麻烦点个赞,谢谢你的支持。
  如果对软件测试、接口测试、自动化测试、性能测试、持续集成、面试经验交流。感兴趣可以进到893694563,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

好好学习,天天向上! 学习不刻苦,不如卖红薯!