前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python深层解析json数据之JsonPath

Python深层解析json数据之JsonPath

作者头像
王大力测试进阶之路
发布2020-07-23 11:45:10
1.7K0
发布2020-07-23 11:45:10
举报

我们在做接口自动化时,一般接口响应的都是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}]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档