Python深层解析json数据之JsonPath

         我们在做接口自动化时,一般接口响应的都是json数据体,对响应数据进行提取使用或断言,当数据量很大或层级很深时,就会变得很麻烦,于是就可以用到jsonpath模块,解决json路径深取值难的问题。

一、 jsonpath介绍

用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

官网文档http://goessner.net/articles/JsonPath

二、安装使用

pip install jsonpath

import jsonpath

jp=jsonpath.jsonpath(response, '$..key_name')

“$”表示最外层的{},“..”表示模糊匹配,输出结果是list,当传入不存在的key_name时,程序会返回false

三、JsonPath与Xpath语法对比

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法

四、案例

案例1:
import jsonpathjson_data1={"error_code": 0,"stu_info": [{"id": 1001,"name": "橙汁","sex": "女","age": 33,"addr": "上海市浦东新区城南路500弄105号","grade": "天蝎座","phone": "18300000000","gold": 10896,"info":{"card":6123492929293838,"bank_name":'招商银行'}},{"id": 1002,"name": "橙子","sex": "男","age": 40,"addr": "陕西省西安市曲江新区","grade": "狮子座","phone": "18200000000","gold": 100}]
}# 获取json_data1中所有phone字段值
print(jsonpath.jsonpath(json_data1,'$..phone'))
['18300000000', '18200000000']# 获取json_data1中所有bank_name字段值
print(jsonpath.jsonpath(json_data1,'$..bank_name'))
['招商银行']# 获取json_data1中info下所有字段值
print(jsonpath.jsonpath(json_data1,'$..info.*'))
[6123492929293838, '招商银行']# 获取json_data1中stu_info中第1个元素中grade字段值
print(jsonpath.jsonpath(json_data1,'$.stu_info.[0].grade'))
['天蝎座']
# 案例2
import jsonpathjson_data2={"body": {"cityId": 605,"title": "本周行情聚焦","weekDate": "07.06-07.12","wechat": "tuboshikefu02","button": "每月专家行情解析,免费参加","reportList": [{"cityId": 605,"skuId": 13158,"skuFullName": "上海不够卖小区榜","spuId": 20130,"spuName": "上海不够卖小区榜","categoryName": "爆款报告","skuPrice": 1100,"spuType": 1,"h5Url": "https://m.2boss.cn/trade/3051420769646018571885?skuIdAlias=3051483295561809939455","reportTitle": "上海不够卖小区榜","reportUrl": "https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592899866409","reportContent": "【最新6月榜】各区最火热的小区,全新数据,那些才是真正最火的小区?各区库存去化周期排行榜。","orderTime": 1593507849000}, {"cityId": 605,"skuId": 13162,"skuFullName": "上海涨涨涨小区榜","spuId": 20134,"spuName": "上海涨涨涨小区榜","categoryName": "爆款报告","skuPrice": 1200,"spuType": 1,"h5Url": "https://m.2boss.cn/trade/3051443826783682574415?skuIdAlias=3051495335856701455454","reportTitle": "上海涨涨涨小区榜","reportUrl": "https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592900443037","reportContent": "【最新6月榜】各区最有可能上涨小区,全新数据,帮你选最能升值的小区,各区房东溢价系数排行榜。","orderTime": 1592980444000},{"id":111,"name":"橙子"}]},"resultCode": 0,"errMsg": ""
}# 获取json_data2中reportList数组的第2个值
print(jsonpath.jsonpath(json_data2, '$.body.reportList[1]'))
[{'skuId': 13162, 'spuId': 20134, 'h5Url': 'https://m.2boss.cn/trade/3051443826783682574415?skuIdAlias=3051495335856701455454', 'orderTime': 1592980444000, 'cityId': 605, 'spuType': 1, 'reportUrl': 'https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592900443037', 'reportTitle': '上海涨涨涨小区榜', 'skuFullName': '上海涨涨涨小区榜', 'categoryName': '爆款报告', 'reportContent': '【最新6月榜】各区最有可能上涨小区,全新数据,帮你选最能升值的小区,各区房东溢价系数排行榜。', 'spuName': '上海涨涨涨小区榜', 'skuPrice': 1200}]# 获取json_data2中reportList数组的所有值
print(jsonpath.jsonpath(json_data2, '$..reportList[0:]'))
[{'spuName': '上海不够卖小区榜', 'reportContent': '【最新6月榜】各区最火热的小区,全新数据,那些才是真正最火的小区?各区库存去化周期排行榜。', 'reportUrl': 'https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592899866409', 'cityId': 605, 'skuPrice': 1100, 'spuType': 1, 'h5Url': 'https://m.2boss.cn/trade/3051420769646018571885?skuIdAlias=3051483295561809939455', 'skuId': 13158, 'reportTitle': '上海不够卖小区榜', 'categoryName': '爆款报告', 'spuId': 20130, 'orderTime': 1593507849000, 'skuFullName': '上海不够卖小区榜'}, {'spuName': '上海涨涨涨小区榜', 'reportContent': '【最新6月榜】各区最有可能上涨小区,全新数据,帮你选最能升值的小区,各区房东溢价系数排行榜。', 'reportUrl': 'https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592900443037', 'cityId': 605, 'skuPrice': 1200, 'spuType': 1, 'h5Url': 'https://m.2boss.cn/trade/3051443826783682574415?skuIdAlias=3051495335856701455454', 'skuId': 13162, 'reportTitle': '上海涨涨涨小区榜', 'categoryName': '爆款报告', 'spuId': 20134, 'orderTime': 1592980444000, 'skuFullName': '上海涨涨涨小区榜'}, {'name': '橙子', 'id': 111}]# 获取json_data2中reportList数组中包含key为name的所有字段
print(jsonpath.jsonpath(json_data2, '$..reportList[?(@.name)]'))
[{'id': 111, 'name': '橙子'}]# 获取json_data2中reportList数组中skuPrice>1100的所有值
print(jsonpath.jsonpath(json_data2, '$..reportList[?(@.skuPrice>1100)]'))
[{'reportContent': '【最新6月榜】各区最有可能上涨小区,全新数据,帮你选最能升值的小区,各区房东溢价系数排行榜。', 'reportUrl': 'https://2boss.oss-cn-hangzhou.aliyuncs.com/dr2_banner/banner_1592900443037', 'categoryName': '爆款报告', 'cityId': 605, 'reportTitle': '上海涨涨涨小区榜', 'skuPrice': 1200, 'spuId': 20134, 'spuName': '上海涨涨涨小区榜', 'h5Url': 'https://m.2boss.cn/trade/3051443826783682574415?skuIdAlias=3051495335856701455454', 'spuType': 1, 'skuFullName': '上海涨涨涨小区榜', 'orderTime': 1592980444000, 'skuId': 13162}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2015+qt5.11入门(实现计算机的加法和登录操作)

1、在vs中新建qt项目 2、打开Form Files中的.ui文件。即打开qt creator界面 3、在界面中添加两个label,两个LineEdit,一个计算按钮。点击保存 控件右击-->改变对象名称可以直接改变控件名。(会映射显示在vs中的ui_projectname.h中&…

Python中map()函数用法

map() 是python的内置函数,会根据提供的函数对指定序列做映射。对可迭代函数*iterables中的每个元素应用func方法,将结果作为迭代器对象返回。注意:map()函数返回的是一个新的迭代器对象,不会改变原有对象 map()用法 class map(ob…

任务管理器只有概要信息解决办法

在任务管理器最顶端左击两下即可ok 参考自:https://wenda.so.com/q/1515482566217850

抓包工具mitmproxy环境配置使用(一)

一、mitmproxy介绍mitmproxy是一款开源的抓包工具,支持SSL的HTTP代理,它可以用于调试HTTP通信,发起中间人攻击等,还可以配合自定义python脚本使用,不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可…

cvtColor不是cv的成员

头文件的问题 #include <opencv2/opencv.hpp> 这个就可以 opencv 3导入文件&#xff1a; #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp>

Pytest fixture参数化params

unittest使用ddt来实现测试用例参数化、或parameterized实现测试用例参数化&#xff0c;pytest测试用例里面对应的参数可以用 parametrize 实现参数化&#xff0c;今天我们来了解下fixture参数化paramsfixture的参数可以解决大量重复代码工作,比如数据库的连接、查询、关闭等.同…

opencv videocapture读取视频cap.isOpened 输出总是false

利用qtopencv3c 读取视频文件&#xff0c;发现isOpened()总是输出false 一直以为是语句的问题&#xff0c;后来反应过来可能是打开视频格式&#xff0c;或者视频本身能否播放。 检查发现&#xff0c;是视频本身不能播放&#xff0c;换了个视频&#xff0c;就ok了

python3中选择文件对话框的格式打开和保存图片

tkinter.filedialog.asksaveasfilename() # 选择以什么文件名保存&#xff0c;返回文件名 tkinter.filedialog.askopenfilename() # 选择打开什么文件&#xff0c;返回文件名有时候我们想要以选择文件对话框的格式打开一张图片或者保存图片&#xff0c;我在尝试之后把我的…

Python测试开发django1.简介

Django是一种基于Python开发的开源的高级Web应用框架&#xff0c;使用Django&#xff0c;使你能够以最小的代价构建和维护高质量的Web应用。Django 本身基于 MVC 模型&#xff0c;即 Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; Controller&#xff0…

$ajax({}).done 和 $ajax({}) success 区别

jquery中1.5版本之后使用ajax中的done方法。 该方法和ajax中的success有类似的功效。首先必须是jquery中的1.5版本之后。 jQuery中各个事件执行顺序如下&#xff1a; 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.er…

Python测试开发django2.环境部署项目创建

Django是由Python编写的Web框架&#xff0c;依赖Python环境&#xff0c;所以需要提前安装好Python环境。建议安装最新版本的Python3&#xff0c;Python 下载地址&#xff1a;https://www.python.org/downloads/1、Django官网https://www.djangoproject.com/2、Django版本Django…

excel如何输入毫秒级时间

1、选择单元格或单元格区域&#xff1b; 2、右击-设置单元格格式&#xff08;或按ctrl1&#xff09;&#xff1b; 3、数字选项卡-自定义-h:mm:ss.000 4、单元格就可以输入精度为千分之一秒的时间&#xff0c;如&#xff1a;20:15:21.451 参考自https://zhidao.baidu.com/questi…

Python测试开发django3.视图和URL配置

1、Django path&#xff08;&#xff09;方法Django路由系统中最重要的path()方法可以接收4个参数&#xff0c;其中2个是必须的&#xff1a;route和view&#xff0c;以及2个可选的参数&#xff1a;kwargs和namedef path(route, view, kwargsNone, nameNone):return re_path(rou…

电脑安装命令记录

安装python3的pandas&#xff1a; pip install pandas numpy python-dateutil pytz 安装sklearn pip install -U scikit-learn 安装torch&#xff1a; pip install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-win_amd64.whl pip install torchvision0.2.0…

Python测试开发django4.templates模板配置

【上一篇】我们讲了Python测试开发django3.视图和URL配置今天详细介绍下 Django 模板的应用&#xff0c;模板是一个文本&#xff0c;用于分离文档的表现形式和内容。我们已经知道创建项目用django-admin startproject helloworld&#xff0c;一个项目下可以有多个应用&#xff…

QImage QPixmap Mat区别

cvMat可以通过自定义函数转换为QImage Qimage通过fromImage函数 可以转换为QPixmap 绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类&#xff0c;分别是QPixmap、QBitmap、QImage和 QPicture。其中&#xff0c;QPixmap专门为图像在屏幕上的显示做了优化&…

Python测试开发django5.templates模板变量传参

上一篇&#xff0c;我们学习了Python测试开发django4.templates模板配置templates模板中html文件是一个静态页面&#xff0c;写四的&#xff0c;如果有时我们想动态的传入一些不同的参数&#xff0c;想实现在一个固定的html样式&#xff0c;这就可以用django的模板变量传参来解…

git入门一

1、下载git并安装 &#xff08;github网站中 start 收藏 follow 关注 watch &#xff08;关注项进度&#xff09;查看进度&#xff09; 2、启动git。一般用git bash 3、改变git bash界面 4、在本地建立git bash仓库 到本地文件夹下&#xff0c;右击建立 git bash here。 5、…

Python测试开发django5.urls.py参数name与a标签的引用

上一篇&#xff0c;我们学习了Python测试开发django5.templates模板变量传参如果我们有2个页面home.html和demo.html&#xff0c;两个页面是独立的没有关系的&#xff0c;现在需要从home.html页&#xff0c;点某个超链按钮&#xff0c;跳转到demo.html页&#xff0c;home.html页…

git入门二

exit 退出git bash 命令窗口 1、刚安装成功界面&#xff1a; 2、查看配置信息&#xff1a; 3、配置用户名和邮箱 此时再看git config --list。已经有用户名和邮箱的信息 4、把当前目录初始化为仓库并提交 5、将远程和本地连接 &#xff08;1&#xff09;在https//github.com 上…