ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python接口自动化(三十一) json解析神器jsonpath

2020-08-08 15:02:47  阅读:323  来源: 互联网

标签:xiaohua name python json jsonpath result 取值


前言

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

 运行结果

 

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

 

标签:xiaohua,name,python,json,jsonpath,result,取值
来源: https://www.cnblogs.com/canglongdao/p/13457817.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有