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

     运行结果

     这样就可以不用管层级也能取值了。

     

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    [luoguU48834][count]
    [ZROJ110][假如战争今天爆发]
    [luogu4860][Roy&October之取石子II]
    [luogu4018][Roy&October之取石子]
    [luoguU48574][藏妹子之处]
    [20181025晚][模拟赛]
    [20181025上午][模拟赛]
    ElasticSearch业务逻辑案例
    ElasticSearch安装及使用
    面试必问:ACID/CAP
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13457817.html
Copyright © 2011-2022 走看看