Python深层解析json数据之JsonPath
时间:2022-07-22
本文章向大家介绍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 jsonpath
json_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 jsonpath
json_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}]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Recyclerview添加头布局和尾布局、item点击事件详解
- Android 中LayoutInflater.inflate()方法的介绍
- Android ListView实现简单列表功能
- Ubuntu16.04上安装CUDA9.0 详细教程
- Android使用LinearLayout设置边框
- Android编程实现状态保存的方法分析
- Android中TextView和ImageView实现倾斜效果
- Notification消息通知 自定义消息通知内容布局
- Android编程实现带渐变效果的圆角矩形示例
- Android仿苹果关机界面实现代码
- Android使用RecycleView实现拖拽交换item位置
- Android编程之计时器Chronometer简单示例
- Android OnFocuChangeListener焦点事件详解
- Android自定义加载圈动画效果
- Android 中ImageView的ScaleType使用方法