JSONPath 的介绍

JSONPath的起源

1. 起源背景

在讨论JSONPath的起源之前,让我们先了解JSONPath是什么。JSONPath 是一种查询语言,用于从JSON(JavaScript Object Notation)数据结构中提取数据。它允许开发者通过类似于XPath的表达式来定位JSON对象中的元素。JSONPath的设计初衷是为了简化从JSON文档中提取数据的操作,特别是在处理复杂的数据结构时。

JSONPath最初是由 Stefan Goessner 在2007年左右提出的。Goessner是一位软件工程师,他在工作中遇到了需要从复杂的JSON数据结构中提取信息的需求,而现有的解决方案(如XPath)对于JSON格式的支持并不理想。因此,他开发了JSONPath,以更直观和灵活的方式来解决这个问题。

2. 灵感来源

虽然JSONPath的设计初衷是为了解决特定的问题,但它的一些基本概念和语法确实受到了XPath的启发。XPath是用于XML文档查询的语言,它提供了一套丰富的表达式来选择XML文档中的节点。Goessner在开发JSONPath时,借鉴了XPath的一些设计理念,例如使用路径表达式来定位数据,以及提供类似于XPath的选择器功能。

3. 发展与应用

随着JSON在Web开发中的广泛应用,JSONPath作为一种轻量级的查询语言,迅速得到了广泛的应用。它不仅被用于客户端JavaScript代码中,还扩展到了服务器端语言(如Java、Python等)的库中,使得开发者可以在各种环境中方便地处理JSON数据。

JSONPath的特点

  • 简洁性:JSONPath表达式通常比XPath更简洁,更易于理解和编写。

  • 灵活性:它支持多种选择器,如点运算符(.)、数组索引、通配符(*)、过滤器([?()])等,使得它能够灵活地处理各种复杂的JSON结构。

  • 跨语言支持:由于JSONPath的简洁性和高效性,它被许多编程语言和框架所支持,从而在多种开发环境中得到了广泛的应用。

结论

JSONPath起源于对现有解决方案(特别是XPath对于XML)的不满和改进需求,旨在为处理JSON数据提供一种更加直接和高效的方法。通过借鉴XPath的一些设计理念并针对JSON数据结构的特点进行优化,JSONPath成为了一种流行且有效的查询语言,广泛应用于现代Web开发和数据处理中。


JSONPath 的详细介绍

以下是关于 JSONPath 的详细介绍,涵盖语法规则、常见用法、Python 实现及实用示例,在处理 JSON 数据时快速定位和提取所需内容:

1. JSONPath 简介

  • 定位:类似于 XPath(用于 XML),JSONPath 是一种 JSON 数据查询语言,用于通过路径表达式定位 JSON 结构中的节点。

  • 应用场景

    • 从复杂嵌套的 JSON 中提取特定字段。

    • 筛选符合条件的数据(如价格大于 100 的商品)。

    • 动态解析 API 返回的 JSON 响应。


2. 核心语法规则

表达式说明
$根节点
. 或 []子节点操作符(. 用于属性名,[] 用于索引或属性名)
*通配符,匹配所有元素或属性
..递归下降,搜索所有层级的子节点
@当前节点(用于过滤表达式)
[,]多选操作符(如 [0,1] 或 ['name','price']
[start:end:step]数组切片(类似 Python 列表切片)
?()过滤表达式(筛选符合条件的节点)

3. 常用表达式示例

示例 JSON

json

复制

{"store": {"book": [{ "category": "fiction", "title": "A Game of Thrones", "price": 25 },{ "category": "fiction", "title": "The Hobbit", "price": 15 },{ "category": "non-fiction", "title": "AI Handbook", "price": 40 }],"location": "New York"}
}
3.1 基础查询
表达式结果
$.store.book[0].title"A Game of Thrones"(第一本书的标题)
$.store.book[*].title所有书的标题 ["A Game of Thrones", "The Hobbit", "AI Handbook"]
$..price所有价格 [25, 15, 40](递归搜索)
$.store.*所有子节点(book 数组和 location 字符串)
3.2 过滤查询
表达式结果
$.store.book[?(@.price > 20)]价格大于 20 的书籍
$.store.book[?(@.category == 'fiction')].title分类为 fiction 的书籍标题 ["A Game of Thrones", "The Hobbit"]
$.store.book[?(@.title contains 'Game')]标题包含 "Game" 的书籍
3.3 复杂操作
表达式结果
$.store.book[-1:]最后一本书 [{ "category": "non-fiction", ... }]
$.store.book[:2].title前两本书的标题 ["A Game of Thrones", "The Hobbit"]
$..book[0,2].title第 0 和第 2 本书的标题 ["A Game of Thrones", "AI Handbook"]

4. Python 中的 JSONPath 实现

4.1 安装库

推荐使用 jsonpath-ng(功能全面):

bash

复制

pip install jsonpath-ng
4.2 基本用法

python

复制

from jsonpath_ng import parsedata = {"store": {"book": [{"category": "fiction", "title": "A Game of Thrones", "price": 25},{"category": "fiction", "title": "The Hobbit", "price": 15},{"category": "non-fiction", "title": "AI Handbook", "price": 40}],"location": "New York"}
}# 解析表达式
expr = parse("$.store.book[?(@.price > 20)].title")# 执行查询
matches = [match.value for match in expr.find(data)]
print(matches)  # 输出:['A Game of Thrones', 'AI Handbook']
4.3 其他 Python 库
  • jsonpath:轻量级库,语法略有差异。

    python

    复制

    import jsonpath
    result = jsonpath.jsonpath(data, "$..book[?(@.price>20)].title")

5. 实用场景示例

5.1 提取 API 响应中的特定字段

python

复制

import requests
from jsonpath_ng import parseresponse = requests.get('https://api.example.com/products').json()
expr = parse("$..products[?(@.stock > 0 && @.price < 100)].name")
names = [match.value for match in expr.find(response)]
5.2 过滤日志中的错误信息

json

复制

{"logs": [{ "level": "INFO", "message": "User logged in" },{ "level": "ERROR", "message": "Database connection failed" },{ "level": "WARNING", "message": "High memory usage" }]
}

python

复制

expr = parse("$.logs[?(@.level == 'ERROR')].message")
errors = [match.value for match in expr.find(log_data)]  # ["Database connection failed"]

6. JSONPath 工具

  • 在线测试工具

    • JSONPath Online Evaluator

    • JSONPath Expression Tester

  • 浏览器插件

    • JSONPath Finder(Chrome)


7. 注意事项

  1. 路径区分大小写:JSON 属性名是大小写敏感的。

  2. 索引从 0 开始:数组的第一个元素索引为 0

  3. 过滤表达式语法差异:不同库的过滤语法可能略有不同(如 == vs eq)。

  4. 性能问题:对超大 JSON 数据谨慎使用递归 ..

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

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

相关文章

C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革

文章目录 一、constexpr 在 <algorithm> 中的应用1. 编译时排序2. 编译时查找 二、constexpr 在 <utility> 中的应用1. 编译时交换2. 编译时条件交换 三、constexpr 在 <complex> 中的应用1. 编译时复数运算 四、总结 C20 对 constexpr 的增强是其最引人注目…

python基础知识,if,elif语句运用(详细),常见编程例题练习

一、问答题 &#xff08;1&#xff09;怎样生成一个满足条件10 ≤ i ≤ 50的随机整数? import random i random.randint(10, 50) random.randint(a, b) #包含a和b &#xff08;2&#xff09;如果number分别是30和35&#xff0c;那么a中的代码和b中的代码的输出结果是什么? …

C++遍历树,前中后序,递归非递归实现

文章目录 前序遍历中序遍历后序遍历代码解释 前序遍历 递归思路&#xff1a;先访问根节点&#xff0c;然后递归遍历左子树&#xff0c;最后递归遍历右子树。非递归思路&#xff1a;使用栈来模拟递归过程。先将根节点入栈&#xff0c;之后循环执行以下操作&#xff1a;弹出栈顶…

Spring 声明式事务应该怎么学?

1、引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写&#xff0c;它的设计如此巧妙&#xff0c;以至于在使用中几乎感觉不到它的存在&#xff0c;只需要优雅地加一个 Transactional 注解&#xff0c;一切就都顺理成章地完成了&#xff01; 毫不夸张地讲&#xff…

面试复习-基础网络+运维知识

一、TCP/IP模型及每层对应通信协议 1.1第一层-应用层 作用&#xff1a;服务及应用程序 HTTP --- 超文本传输协议--- 获取网页信息---80&#xff08;TCP 80&#xff09; HTTPS --- HTTP SSL&#xff08;安全传输协议&#xff09;/TLS ---443&#xff08;TCP 443&#xff09; …

HeyGem.ai 全离线数字人生成引擎加入 GitCode:开启本地化 AIGC 创作新时代

在人工智能技术飞速演进的时代&#xff0c;数据隐私与创作自由正成为全球开发者关注的焦点。硅基智能旗下开源项目 HeyGem.ai 近日正式加入 GitCode&#xff0c;以全球首个全离线数字人生成引擎的颠覆性技术&#xff0c;重新定义人工智能生成内容&#xff08;AIGC&#xff09;的…

【C语言】递归:原理、技巧与陷阱

在C语言编程中&#xff0c;递归是一种非常强大且常用的技术。它允许函数自我调用&#xff0c;从而简化代码并解决复杂问题。然而&#xff0c;递归也可能导致性能问题&#xff0c;如栈溢出。本文将深入探讨递归的原理、应用、优化方法&#xff0c;并提供实际代码示例&#xff0c…

【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“

文章目录 ⭐前言⭐一、同步编程&#xff1a;单线程的线性世界&#x1f31f;1、寻找合适的对象✨1) &#x1f31f;7、设计应支持变化 ⭐二、异步编程&#xff1a;多任务的协奏曲⭐三、async/await工作原理揭秘⭐四、最佳实践与性能陷阱⭐五、异步编程适用场景⭐六、性能对比实测…

[OpenCV】相机标定之棋盘格角点检测与绘制

在OpenCV中&#xff0c;棋盘格角点检测与绘制是一个常见的任务&#xff0c;通常用于相机标定。 棋盘格自定义可参考: OpenCV: Create calibration pattern 目录 1. 棋盘格角点检测 findChessboardCorners()2. 棋盘格角点绘制 drawChessboardCorners()3. 代码示例C版本python版本…

AI-Talk开发板之更换串口引脚

一、默认引脚 CSK6011A使用UART0作为Debug uart&#xff0c;AI-Talk开发板默认使用的GPIOA2和GPIOA3作为Debug uart的RX和TX&#xff0c;通过连接器CN6引出。 二 、更换到其它引脚 查看60xx_iomux_v1.0可以&#xff0c;UART0的tx和rx可以映射到很多管脚上。 结合AI-Talk开发板…

QT Quick(C++)跨平台应用程序项目实战教程 3 — 项目基本设置(窗体尺寸、中文标题、窗体图标、可执行程序图标)

目录 1. 修改程序界面尺寸和标题 2. 窗体图标 3. 修改可执行程序图标 上一章创建好了一个初始Qt Quick项目。本章介绍基本的项目修改方法。 1. 修改程序界面尺寸和标题 修改Main.qml文件&#xff0c;将程序宽度设置为1200&#xff0c;程序高度设置为800。同时修改程序标题…

【STM32实物】基于STM32的太阳能充电宝设计

基于STM32的太阳能充电宝设计 演示视频: 基于STM32的太阳能充电宝设计 硬件组成: 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。 功能…

003-掌控命令行-CLI11-C++开源库108杰

首选的现代C风格命令行参数解析器! &#xff08;本课程包含两段教学视频。&#xff09; 以文件对象监控程序为实例&#xff0c;五分钟实现从命令行读入多个监控目标路径&#xff1b;区分两大时机&#xff0c;学习 CLI11 构建与解析参数两大场景下的异常处理&#xff1b;区分三…

OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类&#xff0c;它属于 stitching 模块的一部分。这个类实现了基于羽化&#xff08;…

如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)

一、Function Calling&#xff1a;大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能&#xff08;对应模型版本gpt-3.5-turbo-0613和gpt-4-0613&#xff09;&#xff0c;允许开发者通过自然语言指令触发预定义函数&#xff0c;实…

鸿蒙ArkTS+ArkUI实现五子棋游戏

鸿蒙ArkTSArkUI实现五子棋游戏 前言 近期&#xff0c;鸿蒙系统热度飙升&#xff0c;引发了周围众多朋友的热烈探讨。出于这份浓厚的好奇心&#xff0c;我初步浏览了其官方文档&#xff0c;发现信息量庞大&#xff0c;全面消化需耗时良久并考验人的毅力。自踏入编程领域以来&am…

单元测试mock

一、背景 现在有A类,B类,C类&#xff0c;A类依赖B类,依赖C类&#xff0c;如果想要测试A类中的某个方法的业务逻辑。A类依赖其他类&#xff0c;则把其他类给mock&#xff0c;然后A类需要真实对象。这样就可以测试A类中的方法。 举例&#xff1a;Ticket类需要调用Flight类和Pas…

深度学习篇---深度学习中的范数

文章目录 前言一、向量范数1.L0范数1.1定义1.2计算式1.3特点1.4应用场景1.4.1特征选择1.4.2压缩感知 2.L1范数&#xff08;曼哈顿范数&#xff09;2.1定义2.2计算式2.3特点2.4应用场景2.4.1L1正则化2.4.2鲁棒回归 3.L2范数&#xff08;欧几里得范数&#xff09;3.1定义3.2特点3…

JVM常见概念之条件移动

问题 当我们有分支频率数据时&#xff0c;有什么有趣的技巧可以做吗&#xff1f;什么是条件移动&#xff1f; 基础知识 如果您需要在来自一个分支的两个结果之间进行选择&#xff0c;那么您可以在 ISA 级别做两件不同的事情。 首先&#xff0c;你可以创建一个分支&#xff…

Debug-037-table列表勾选回显方案

效果展示&#xff1a; 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能&#xff1a; 在图1中的列表中有三行数据&#xff0c;当点击“更换设备”按钮时&#xff0c;打开抽屉显示el-table组件如图2所示&#xff0c;可以直接回显勾选…