python自动解析json_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"

运行结果

1568466-20200808142406449-493540423.png

当层级越来越深的时候,会发现取值变得困难,并且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

运行结果

1568466-20200808144149147-159501331.png

jsonpath解析

接下来讲一个非常强大并且方便的jsonpath专门用于json解析,解决路径深的老大难问题!

先安装依赖包

pip install jsonpath

学习jsonpath不得不提到xpath,这两者之间的语法是差不多的

1568466-20200808144506379-82058701.png

使用示例

$是查找的根节点,传参就是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)

运行结果

1568466-20200808145402752-1534839778.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值