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
0
投稿
猜你喜欢
- 目录前言🎪 一、Python 关键字🎢 二、Python标识符🎠 2.1 在 Python 中创建标识符的指南🎡 2.2 测试标识符是否有效
- #!/usr/bin/python# -*- coding: utf-8 -*-from scapy.all import *from ti
- 一些杀毒软件经常会把某些asp文件当成病毒删除,如卡巴斯基杀毒软件就经常把网页中有Microsoft.XMLHTTP 的当作病毒,有时简直防
- 最近参与了将一个Sybase数据库移植到Microsoft SQL Server 2000上的项目,我在这一项目上获得的经验,将对Sybas
- 其实发这篇博感觉并没有什么用,太简单了,会的人不屑看,不会的人自已动动脑子也想到了。但是看着自已的博客已经这么久没更,真心疼~。粗略算下一篇
- 前言当需要将多张图像拼接成一张更大的图像时,通常会用到图片拼接技术。这种技术在许多领域中都有广泛的应用,例如计算机视觉、图像处理、卫星图像、
- 本文整理了Pytorch框架下模型的保存、复用、推理、再训练和迁移等实现。模型的保存与复用模型定义和参数打印# 定义模型结构class Le
- Balloons(气球状提示)问题摘要气球状提示(Balloon)是一个小型的弹出窗口,用于通知用户出现非关键性问题或控件处于某种特殊情况。
- 因为python打包的时候需要用到ico图片格式,网上看好的图片又没有ico,于是自己寻找了一下python转换图片格式的方法,彻底解决这个
- 针对Python 3.5.2 测试首先安装两个包:$ pip install googletrans$ pip install pdfmin
- 现在我将清除页面缓存的一些方法总结如下:1、在Asp页面首部加入<% Response.Buffer = True
- MVC设计模式MVC (Model-View-Controller) 是软件工程中常用的软件架构模式,它是一种分离业务逻辑与显示界面的设计方
- 相信大家都遇到过这种情况,下载文件的时候遇到压缩包又没有密码,或者说自己设置的加密密码,但是忘记了,就很难受~但是~在Python程序员面前
- Python实现八大排序算法,具体内容如下1、插入排序描述插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个
- 有时候需要比较大的计算量,这个时候Python的效率就很让人捉急了,此时可以考虑使用numba 进行加速,效果提升明显~(numba 安装貌
- 发现问题写python的时候出现了这个错,然后网上的教程的解决方案几乎都是——“重新定义下这个变量”,看的我一脸懵逼后来发现原来是我把ret
- 本文实例讲述了Python2.7中SQLite3基本操作方法。分享给大家供大家参考,具体如下:1、基本操作# -*- coding: utf
- 目录一、使用说明二、代码分析1. 功能函数2. 回调函数3. 线程生成函数4. 效果展示写在最后在科研学习的过程中,我们难免需要查询相关的文
- 概要不要以为 Python 有自动垃圾回收就不会内存泄漏,本着它有“垃圾回收”我有“垃圾代码”的精神,现在总结一下三种常见的内存泄漏场景。无
- goto语句在Go编程语言中的goto语句提供无条件跳转从跳转到标记声明的功能。注意:使用goto语句是高度劝阻的在任何编程语言,因为它使得