python接口自动化--json解析神器jsonpath

前言


 

  做接口测试的时候,大部分情况下返回的是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,这两者之间的语法是差不多

XpathJSONPath描述
/ $ 跟节点
. @ 现行节点
/ . 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,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

posted @ 2020-07-01 18:22  骑着乌龟赶猪  阅读(579)  评论(0编辑  收藏  举报