JSONPath提取器案例详解

news2024/12/24 2:17:18

jsonpath语法

$ 表示根节点,也是所有jsonpath表达式的开始
. 表示获取子节点
.. 表示获取所有符合条件的内容
*  代表所有的元素节点
[] 表示迭代器的标示(可以用于处理下标等情况)
[,] 表示多个结果的选择
?() 表示过滤操作
 @ 表示当前节点

一、使用代码示例

引入jsonpath库,调用jsonpath方法,入参1是响应结果,入参2是jsonpath表达式。

import jsonpath

data = {
    "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
        }
    },
    "expensive": 10
}

color = jsonpath.jsonpath(data, '$..bicycle.color')
print(color)

二、解析结果-案例1

2.1 数据内容

看一下结构如下图:

根节点下只有2个子节点store和expensive。
store有2个子节点book和bicycle
book是一个列表,有4个字典元素,每个字典有4个元素节点
bicycle是一个字典,有2个元素节点color和price

在这里插入图片描述

data = {
    "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
        }
    },
    "expensive": 10
}

2.2 提取bicycle的color

以下三种表达式都可以提取到color。如果可以提取到结果,结果将是一个list,要想取值可通过下标访问。如果没有提取到结果,结果将是False。代码中可以封装一下jsonpath,用isinstance方法对返回结果进行判断。

# 逐级
color = jsonpath.jsonpath(data, '$.store.bicycle.color')
print(color[0])

# 先定位到bicycle节点,再定位到color子节点
color1 = jsonpath.jsonpath(data, '$..bicycle.color')
print(color1[0])

# 由于结构中只有一个color节点,所以可以直接找color节点
color2 = jsonpath.jsonpath(data, '$..color')
print(color2[0])

result:

red
red
red

2.3 提取所有的book

同样两种表达式提取结果相同,更推荐第2种

book1 = jsonpath.jsonpath(data,'$.store.book')
print(book1)

book2 = jsonpath.jsonpath(data,'$..book')
print(book2)

result:

[[{'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}]]
[[{'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}]]

2.4 获取store下所有的price节点的值

同样两种表达式提取结果相同。提取到的值,有book节点中所有的price,也有bicycle的price节点。

# 获取store下所有的price节点的值
price1 = jsonpath.jsonpath(data, '$.store..price')
print(price1)

price2 = jsonpath.jsonpath(data, '$..price')
print(price2)

result:

[8.95, 12.99, 8.99, 22.99, 19.95]
[8.95, 12.99, 8.99, 22.99, 19.95]

2.5 切片:获取book下的price节点

# 获取book下的所有price节点
price3 = jsonpath.jsonpath(data, '$..book..price')
print(price3)

# 连接操作符,在xpath中 结果合并其他结果的集合。JSONPATH允许name或者数据索引。类似于xpath
# 提取前3本书的price(索引0,索引1,索引2)
price4 = jsonpath.jsonpath(data, '$.store.book[0,1,2].price')
print(price4)

# 提取前3本书的price(索引0-索引2,前闭后开,下同)
price5 = jsonpath.jsonpath(data, '$.store.book[:3].price')
print(price5)

# 提取第2、3本书的price(索引1到索引2两本)
price6 = jsonpath.jsonpath(data, '$.store.book[1:3].price')
print(price6)

# 倒数第1的索引是-1,取倒数第一
price7 = jsonpath.jsonpath(data, '$.store.book[-1:].price')
print(price7)

# 取倒数第3和倒数第2两本的price
price8 = jsonpath.jsonpath(data, '$.store.book[-3:-1].price')
print(price8)

result:

[8.95, 12.99, 8.99, 22.99]
[8.95, 12.99, 8.99]
[8.95, 12.99, 8.99]
[12.99, 8.99]
[22.99]
[12.99, 8.99]

2.6 过滤操作

# 获取price大于10的所有book
book_1 = jsonpath.jsonpath(data,'$..book[?(@.price>10)]')
print(book_1)

result:
提取到2本书。

[{'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99}, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]

2.7 表达式错误

# 这是一条错误的JsonPath
book_2 = jsonpath.jsonpath(data,'$..Evelyn Waugh[?(@.price>10)]')
print(book_2)

result:
提取不到结果,返回的就是False

False

三、解析结果-案例2

3.1 数据内容

根节点下只有1个子节点Connections,且是一个列表,有3个元素,每个元素是一个字典。每个元素有RoleRelationships、Name、Gender、Age四个节点。
RoleRelationships是一个列表,仅有1各元素,每个元素有3个节点:CreatedTime、Type、Role

在这里插入图片描述

resp = {
    "Connections": [
        {
            "RoleRelationships": [
                {
                    "CreateTime": "2021-09-08T08:50:56.452Z",
                    "Type": "家人",
                    "Role": "妈妈"
                }
            ],
            "Name": "闵慧",
            "Gender": "Female",
            "Age": 28
        },
        {
            "RoleRelationships": [
                {
                    "CreateTime": "2021-09-08T08:50:56.452Z",
                    "Type": "家人",
                    "Role": "爸爸"
                }
            ],
            "Name": "辛旗",
            "Gender": "Male",
            "Age": 30
        },
        {
            "RoleRelationships": [
                {
                    "CreateTime": "2021-09-08T08:50:56.452Z",
                    "Type": "亲戚",
                    "Role": "妈妈"
                }
            ],
            "Name": "曹牧",
            "Gender": "Female",
            "Age": 30
        }
    ]
}

3.2 提取数据

# 角色是妈妈的
result1 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0].Role=='妈妈')]")
print(f"1-角色是妈妈:{result1}")

result2 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0])].[?(@.Role=='妈妈')]")
print(f"2-角色是妈妈:{result2}")

result3 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0])]..Name")
print(f"3-所有人的名字:{result3}")

result4 = jsonpath.jsonpath(resp, '$.Connections')
print(f"4-所有关系:{result4}")

# 所有家人
result5 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0].Type=='家人')]")
print(f"5-type是家人:{result5}")

result6 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0])].[?(@.Type=='家人')]")
print(f"6-type是家人:{result6}")

# 年龄大于28的
result7 = jsonpath.jsonpath(resp, "$.Connections.[?(@.Age>28)]..Name")
print(f"7-年龄大于28:{result7}")

result8 = jsonpath.jsonpath(resp, "$.Connections[?(@.RoleRelationships[0].Role=='爸爸')].Name")
print(f"8-爸爸的名字:{result8}")

result:

1-角色是妈妈:False
2-角色是妈妈:[{'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '家人', 'Role': '妈妈'}, {'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '亲戚', 'Role': '妈妈'}]
3-所有人的名字:['闵慧', '辛旗', '曹牧']
4-所有关系:[[{'RoleRelationships': [{'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '家人', 'Role': '妈妈'}], 'Name': '闵慧', 'Gender': 'Female', 'Age': 28}, {'RoleRelationships': [{'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '家人', 'Role': '爸爸'}], 'Name': '辛旗', 'Gender': 'Male', 'Age': 30}, {'RoleRelationships': [{'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '亲戚', 'Role': '妈妈'}], 'Name': '曹牧', 'Gender': 'Female', 'Age': 30}]]
5-type是家人:False
6-type是家人:[{'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '家人', 'Role': '妈妈'}, {'CreateTime': '2021-09-08T08:50:56.452Z', 'Type': '家人', 'Role': '爸爸'}]
7-年龄大于28['辛旗', '曹牧']
8-爸爸的名字:False

问题:
1、结果为False的,小编使用JSONPath Online Evaluator - jsonpath.com都是可以提取出结果的,但是用python脚本提取不出结果,并且jsonpath的入参也没有问题。有解决办法欢迎评论。

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

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

相关文章

【QT】Day1

1. 收到实现登录框 要求&#xff1a; 1、登录窗口更改标题、图标 2、设置固定尺寸、并给定一定的透明度 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于打印输出的 #include <QIcon>…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹&#xff08;mkdir或md&#xff09; 创建单个文件&#xff1a;mkdir cmd_test 创建二级文件&#xff1a;mkdir cmd_test\456\123 创建多个文件&#xff1a;mkdir cmd_test\000 cmd_test\111 2…

【js】javascript中base64转file、file压缩图片:

文章目录 一、效果图:二、实现代码: 一、效果图: 二、实现代码: /*** base64转file* param {string} urlData base64格式图片* returns */ export function base64ConvertFile(urlData) {if (typeof urlData ! string) {this.$toast("urlData不是字符串")return;}va…

IDEA 模块不加载依旧是灰色 没有变成小蓝色的方块

Settings > Build, Execution, Deployment > Build Tools > Maven > Ignored Files下降对应的模块勾选掉 但通常在Maven的配置中&#xff0c;您会找到一个名为“ignoredFiles”的列表&#xff0c;其中包含被忽略的文件和目录。您可以通过取消选中所需的文件或目录…

腾讯云—自动挂载云盘

腾讯云&#xff0c;稍微麻烦了点。 腾讯云服务器&#xff0c;镜像为opencloudos 8。 ### 1、挂载云盘bash #首先通过以下命令&#xff0c;能够看到新的数据盘&#xff0c;如果不能需要通过腾讯云控制台卸载后&#xff0c;重新挂载&#xff0c;并重启服务器。 fdisk -l#为 /dev…

【iVX】低代码未来发展趋势

未来低代码开发将更加注重用户体验、集成能力、自动化水平和移动支持。同时&#xff0c;应用场景也将进一步扩展&#xff0c;安全与可靠性也将得到更大程度的关注和加强。这些发展方向将进一步推动低代码开发在各个行业和领域的广泛应用和发展。 增强设计能力&#xff1a;低代码…

RFID技术如何赋能化工行业?

化工生产是指在化工行业中&#xff0c;将原材料经过一系列的物理、化学或生物过程转化为最终产品的过程。RFID技术在化工行业中提供了实时跟踪、自动化控制、安全监测和环境管理等方面的帮助&#xff0c;对于提高生产效率、质量控制和安全性具有重要的意义。我们通过典型的化工…

【100天精通python】Day18:python程序异常与调试_常用程序调试方式与技巧,如何将调试代码与正式代码分开

一 程序调试 在Python中&#xff0c;调试是指识别和修复程序中的错误和问题。 调试是程序开发过程中必不可少的一部分&#xff0c;合理利用调试工具和技术可以提高程序开发的效率和质量。Python提供了几种用于调试的工具和技术&#xff0c;帮助开发者找出程序中的bug并进行修复…

论文笔记:Fine-Grained Urban Flow Prediction

2021 WWW 1 intro 细粒度城市流量预测 两个挑战 细粒度数据中观察到的网格间的转移动态使得预测变得更加复杂 需要在全局范围内捕获网格单元之间的空间依赖性单独学习外部因素&#xff08;例如天气、POI、路段信息等&#xff09;对大量网格单元的影响非常具有挑战性——>论…

Spring Batch教程(五)spring boot实现batch功能注解示例:读写文本文件(读取一行数据,针对一行数据进行求和)

Spring batch 系列文章 Spring Batch教程&#xff08;一&#xff09; 简单的介绍以及通过springbatch将xml文件转成txt文件 Spring Batch教程&#xff08;二&#xff09;示例&#xff1a;将txt文件转成xml文件以及读取xml文件内容存储到数据库mysql Spring Batch教程&#xff…

【Spring】Spring 总览

一、简单介绍一下 Spring Spring是一个全面的、企业应用开发的一站式解决方案&#xff0c;贯穿表现层、业务层、持久层&#xff0c;可以轻松和其他框架整合&#xff0c;具有轻量级、控制反转、面向切面、容器等特征。 轻量级 &#xff1a; 空间开销和时间开销都很轻量 控制反…

应用无线鼠标中的2.4GHz无线收发芯片

无线键盘和无线鼠标作为现代办公环境中常见的工具&#xff0c;为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的&#xff0c;其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…

运放稳定性分析

基础回顾 电路系统的传函 记基本量为&#xff1a; 电量&#xff08;库伦&#xff09; q q q、电流 i i i、电压 e e e、电阻 R R R、电容 C C C、电感 L L L 电阻 e R i R e_RiR eR​iR&#xff0c;阻抗 R R R 电容 q C e C qCe_C qCeC​&#xff0c;故 e C 1 C q 1 C…

K8s 详解(一) K8s 架构和常用命令

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

芯片制造详解.净洁室的秘密.学习笔记(三)

这是芯片制造系列的第三期跟学up主三圈&#xff0c;这里对其视频内容做了一下整理和归纳&#xff0c;喜欢的可以看原视频。 芯片制造详解03&#xff1a; 洁净室的秘密&#xff5c;为何芯片厂缺人&#xff1f; 芯片制造详解.净洁室的秘密.学习笔记 三 简介一、干净的级别二、芯片…

ClickHouse(四):ClickHouse分布式搭建及其他

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &#x1f4cc;订阅…

Python爬虫实例之淘宝商品页面爬取(api接口)

可以使用Python中的requests和BeautifulSoup库来进行网页爬取和数据提取。以下是一个简单的示例&#xff1a; import requests from bs4 import BeautifulSoupdef get_product_data(url):# 发送GET请求&#xff0c;获取网页内容headers {User-Agent: Mozilla/5.0 (Windows NT…

管理类联考——大纲篇

综合能力考试大纲 Ⅰ、考试性质 综合能力考试是为高等院校和科研院所招收管理类专业学位硕士研究生而设置的具有选拔性质的全国联考科目&#xff0c;其目的是科学、公平、有效地测试考生是否具备攻读专业学位所必须的基本素质、一般能力和培养潜能&#xff0c;评价的标准是高…

python自动化测试+unittets框架

我们整个自动化才是报告的环节基本上分为三个部分&#xff1a; 1.测试用例的准备 2.测试用例的执行 3.测试报告的输出 1.测试用例的准备&#xff1a; 那我们就以搜孤网页做一个简单的用例&#xff1a; from selenium import webdriver import unittest class Case_1(unit…

【随机森林-鸢尾花分类】

1. 引言 随机森林是集成学习中的一颗瑞士军刀&#xff0c;它是一种强大的机器学习算法&#xff0c;常用于分类和回归任务。随机森林集合了“三个臭皮匠&#xff0c;顶个诸葛亮”的智慧&#xff0c;通过组合多个决策树的预测结果&#xff0c;来提高模型的鲁棒性和性能。 2. 随…