python-json校验-jsonpath解析
作者:雨水的早晨 发布时间:2023-11-20 11:40:01
标签:python,json校验,jsonpath
背景
在进行接口自动化测试的时候,对响应结果进行校验,基本上都是对json数据的校验,响应内容十分复杂,当然验证也是一个很庞大的工程 ,不过都是可以通过jsonpath 解决。
JSONPath 提供了强大的 JSON 解析功能,可以更便捷灵活的用来获取对应的 JSON 内容。
表示法
JSONPath 有两种表示方式, 可以使用点表示法,也可以使用括号表示法
点表示法 例子:$.store.book[0].title
括号表示法 例子:$['store']['book'][0]['title']
官方帮助文档
jsonpath的语法
语法 | 描述 |
---|---|
$ | 根对象/元素 |
@ | 当前对象/元素 |
. 或者 [] | 子运算符,匹配下级元素 |
.. | 递归下降,递归方式匹配所有子元素 |
* | 通配符。所有对象/元素,无论其名称 |
[] | 下标运算符,jsonpath 从0开始 |
[,] | 连接的操作符,多个结果拼接成列表返回 |
[开始:结束:步骤] | 从 ES4 借来的数组切片运算符。 |
?() | 应用过滤器(脚本)表达式。 |
() | 脚本表达式,使用底层脚本引擎。 |
示例
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
jsonpath | 结果 | 备注 |
---|---|---|
$.store.book[*].author | 所有书籍的作者 | |
$..author | 所有的作者 | |
$.store.* | 商店下的所有元素/对象,包括书籍和自行车 | |
$.store..price | 商店里所有元素/对象的价格 | |
$..book[2] | 下标从0开始,第3本书 | |
$..book[(@.length-1)] | 按顺序排列最后一本书 | 用到了()和@两个语法 |
$..book[-1:] | 按顺序排列最后一本书 | 用到了[]数组下标切片 |
$..book[0,1] | 第1本书和第2本书,前两本书 | |
$..book[:2] | 第1本书和第2本书,前两本书 | $…book[0:2] ,从0开始,0 1,前两本书 |
$..book[?(@.isbn)] | 有isbn字段的所有书籍 | |
$..book[?(@.price<10)] | 所有价格小于10的书籍 | |
$..* | json结构的所有元素 |
实战
安装jsonpath
pip3 install jsonpath
以网上一个开源的获得天气的API为例子:
def test_get_json(self):
r = requests.get("http://t.weather.sojson.com/api/weather/city/101191102")
print(r.text)
r_json = r.json()
# 用点方法来获得notice的内容
yesterday = jsonpath(r_json, "$.data.yesterday.notice")
print(yesterday)
# 获得aqi=15 的forecast元素
aqi = jsonpath(r_json, "$..forecast[?(@.aqi==15)]")
print(aqi)
当不知道有jsonpath这个神器的时候,我是通过遍历一个个元素,然后再去比对具体的字段信息,比如下方:获得duration 超过7000 的api信息
{
"apis": [{
"path": "/path",
"duration": 7890
}, {
"path": "/path",
"duration": 6890
}, {
"path": "/path",
"duration": 5890
}]
}
通过遍历的方式获得:
apis = '{"apis":[{"path":"/path","duration":7890},{"path":"/path","duration":6890},{"path":"/path","duration":5890}]}'
print(json.loads(apis))
apis_json = json.loads(apis)
# 一个个遍历
api_duration = []
for api in apis_json["apis"]:
duration = api["duration"]
if int(duration) > 7000:
print(str(duration))
api_duration.append(api["path"])
print(api_duration)
通过jsonpath获得
#jsonpath 更简单
api_duration2 = jsonpath(apis_json, "$.apis[?(@.duration>7000)].path")
print(api_duration2)
来源:https://blog.csdn.net/qq_15283475/article/details/126838482


猜你喜欢
- 部署 Jenkins请提前在 Linux 上安装 Docker,在 Linux 中,我们使用 Docker 启动 Jenkins,这样可以避
- uwsgi介绍uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作
- 在开发C/S结构的大型数据库应用软件时,一般情况下,软件开发人员和数据库设计人员并不是同一个人,这就需要协商好一些即可由程序设
- 又发现一个IE不标准的地方,unshift方法会返回新数组的长度,但IE6与IE7则返回undefined。var a = [3,2,1,4
- 引言JavaScript 的 switch 有四样写法,你知道么?不管你知道不知道,反正我是不知道。我所知道的 JavaScript 的 s
- 一封电子邮件的旅程是:MUA:Mail User Agent——邮件用户代理。(即类似Outlook
- 什么是Three.js? 如果你正在读这篇文章,你可能对Three.js有一定的了解,那我们来简单地介绍下Three.js是什么.Three
- 制作NBA数据爬虫捋顺思路我们在这里选择的是百度体育带来的数据,我们在百度当中直接搜索NBA跳转到网页,我们可以看到,百度已经为我们提供了相
- 本文实例讲述了layui实现显示数据表格、搜索和修改功能。分享给大家供大家参考,具体如下:<div style="text-
- 参考: Smashing magzine翻译+整理: Demix当完成一项前端的工作之后,许多人都会忘记该项目的结构与细节。然而代码并不是马
- 1. 目的每天上班,工作需要,电脑上需要每天开机启动一些软件,下班时候,需要关掉一些软件。一个一个打开和关闭貌似是很繁琐的,于是乎,这个脚本
- 写在前面和小伙伴们分享一些Python 网络编程的一些笔记,博文为《Python Cookbook》读书后笔记整理博文涉及内容包括:TCP/
- 目录1.触发器是什么?2.创建触发器创建触发器的语法如下:创建多个执行语句的触发器: NEW和OLD的使用:3.使用触发器1.触发
- 1 将下面代码拷贝到一个文件,命名为asyncore.pyimport socketimport selectimport sysdef d
- 环境系统:win10cpu:i7-6700HQgpu:gtx965mpython : 3.6pytorch :0.3数据下载来源自Sasan
- <?php header(“Content-Type:text/html;charset=utf-8″); if (isset($_G
- 前言接上文 matlab与Excel交互 非xlsread和xlswrite (1) ,此处默认:Excel=actxserver(‘Exc
- 开发环境解释器版本: python 3.8代码编辑器: pycharm 2021.2第三方模块requests: pip install r
- 一. 如何调用def f1(arg1, arg2): print('f1', arg1, arg2)def f2
- 前言说到覆盖索引之前,先要了解它的数据结构:B+树。先建个表演示(为了简单,id按顺序建):idname1aa3kl5op8aa10kk11