zoukankan      html  css  js  c++  java
  • 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

      

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

  • 相关阅读:
    电信网络拓扑图自动布局之总线
    长短链接区别-2
    TCP长连接与短连接的区别
    memset(&a, 0, sizeof(struct customer))函数
    linker command failed with exit code 1
    iOS “[App] if we're in the real pre-commit handler we can't actually add any new fences due
    iOS 获取屏幕某个区域的截图-b
    iOS-集成支付宝支付、微信支付简单总结
    邓白氏码的申请-iOS公司开发者账号准备
    iOS 自定义导航栏 和状态栏
  • 原文地址:https://www.cnblogs.com/zzpython/p/13220799.html
Copyright © 2011-2022 走看看