深入解析 JSONPath:从入门到精通
在数据处理和交换领域,JSON已经成为了一种广泛使用的数据格式,
如何有效地查询和操作这些数据也变得越来越重要。在这种情况下,JSONPath 应运而生,成为了一种在JSON数据中定位和提取信息的强大工具。
目录
- 一、什么是 JSONPath
- 二、JSONPath 基本语法
- 三、JSONPath 高级特性
- 四、JSONPath 应用场景
- 五、JSONPath的使用
- 结语
一、什么是 JSONPath
JSONPath 是一种在JSON数据中查询信息的表达式语言,它允许用户通过一种简洁明了的语法来定位和提取JSON对象中的特定数据。与XML的XPath类似,JSONPath 提供了一种灵活且强大的方式来查询JSON结构中的数据。
二、JSONPath 基本语法
JSONPath 的语法相对简单,但功能却非常强大。以下是一些基本的语法规则:
- $:表示JSON数据的根对象。
- . 或 []:用于访问对象的属性或数组的元素。例如,
$.name
或 $[‘name’] 都可以访问根对象中的 ‘name’ 属性。 - …:表示递归下降,用于查找所有级别的属性。
- ?():应用一个过滤表达式来过滤数组中的元素。例如,
$?(@.age>18)
将选择所有年龄大于18的对象。 - []:在属性名或数组索引位置使用,表示选择所有元素。例如,
$.students[*].name
将选择所有学生的名字。 - -1、0、1、n:用作数组索引时,表示从最后一个元素开始计数。例如,
$.students[-1].name
将选择最后一个学生的名字。
三、JSONPath 高级特性
除了基本语法之外,JSONPath 还提供了一些高级特性,使得数据查询更加灵活和强大。
- 通配符与切片:你可以使用
*
通配符来选择所有属性,或者使用切片语法(如[start:end:step]
)来选择数组中的特定元素范围。 - 函数:JSONPath 支持一些内置函数,如
length()
(获取数组或字符串长度)、keys()
(获取对象所有键)等,这些函数可以在查询中进行更复杂的操作。 - 条件表达式:通过结合使用
?()
和逻辑操作符(如&&
、||
),你可以构建复杂的条件表达式来过滤数据。
四、JSONPath 应用场景
JSONPath 在多个领域都有广泛的应用,包括但不限于:
- 数据验证:通过 JSONPath 表达式,你可以轻松地验证 JSON 数据的结构和内容是否符合预期。
- 数据提取与转换:在处理大量 JSON 数据时,JSONPath 可以帮助你快速定位和提取所需信息,或者将数据转换为其他格式。
- 自动化测试:在自动化测试中,你可以使用 JSONPath 来验证 API 响应中的数据是否符合预期。
- 日志分析:对于包含 JSON 格式的日志文件,JSONPath 可以帮助你快速提取和分析关键信息。
五、JSONPath的使用
以下是一些JSONPath的使用,展示了如何使用JSONPath表达式从JSON数据中提取信息。
假设我们有以下JSON数据:
{"store": {"book": [{"title": "Sword of Honour","price": 12.99},{"title": "Moby Dick","price": 8.99},{"title": "The Lord of the Rings","price": 22.99}],"bicycle": {"color": "red","price": 19.95}},"expensive": 10
}
首先,需要将JsonPath
库添加到项目中。如果你使用Maven,可以在pom.xml
文件中添加以下依赖:
<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.7.0</version> <!-- 请检查是否有更新的版本 -->
</dependency>
接下来是Java代码:
import com.jayway.jsonpath.JsonPath;public class JsonPathExample {public static void main(String[] args) {String json = "{\n" +" \"store\": {\n" +" \"book\": [\n" +" {\n" +" \"title\": \"Sword of Honour\",\n" +" \"price\": 12.99\n" +" },\n" +" {\n" +" \"title\": \"Moby Dick\",\n" +" \"price\": 8.99\n" +" },\n" +" {\n" +" \"title\": \"The Lord of the Rings\",\n" +" \"price\": 22.99\n" +" }\n" +" ],\n" +" \"bicycle\": {\n" +" \"color\": \"red\",\n" +" \"price\": 19.95\n" +" }\n" +" },\n" +" \"expensive\": 10\n" +"}\n";// 提取所有的书名String bookTitlesPath = "$.store.book[*].title";Object bookTitles = JsonPath.read(json, bookTitlesPath);System.out.println("Book Titles: " + bookTitles);// 提取第一本书的价格String firstBookPricePath = "$.store.book[0].price";Object firstBookPrice = JsonPath.read(json, firstBookPricePath);System.out.println("First Book Price: " + firstBookPrice);// 提取价格大于10的书名String expensiveBookTitlesPath = "$.store.book[?(@.price > 10)].title";Object expensiveBookTitles = JsonPath.read(json, expensiveBookTitlesPath);System.out.println("Expensive Book Titles: " + expensiveBookTitles);}
}
首先定义了一个JSON字符串json
,然后使用JsonPath.read
方法来执行JSONPath查询。分别查询了所有的书名、第一本书的价格以及价格大于10的书名,并将结果打印出来。
下面是使用上述JSON数据的更多JSONPath用法:
-
提取bicycle的颜色
JSONPath 表达式:
$.store.bicycle.color
String bicycleColorPath = "$.store.bicycle.color"; Object bicycleColor = JsonPath.read(json, bicycleColorPath); System.out.println("Bicycle Color: " + bicycleColor);
-
提取不是"Sword of Honour"的所有书名
为了提取不等于"Sword of Honour"的书名,我们可以使用
!=
操作符。但请注意,不是所有的JSONPath实现都支持这种比较操作。如果你的实现不支持,你可能需要在应用层面进行过滤。假设我们的JSONPath库支持这种比较,表达式可能类似于:
JSONPath 表达式:
$.store.book[?(@.title != 'Sword of Honour')].title
String notSwordOfHonourPath = "$.store.book[?(@.title != 'Sword of Honour')].title"; Object notSwordOfHonourTitles = JsonPath.read(json, notSwordOfHonourPath); System.out.println("Book Titles Not 'Sword of Honour': " + notSwordOfHonourTitles);
-
提取最贵的书的价格
为了获取最贵的书的价格,我们可以先获取所有书的价格,然后在应用层面找到最大值。但如果JSONPath实现支持,我们也可以直接在表达式中使用
max()
函数。JSONPath 表达式(如果支持):
$.store.book[*].price.max()
在标准的JsonPath中并不直接支持这样的聚合函数,因此你可能需要在Java代码中处理这个问题:
String allPricesPath = "$.store.book[*].price"; List<Double> allPrices = JsonPath.read(json, allPricesPath); double maxPrice = Collections.max(allPrices); System.out.println("Maximum Book Price: " + maxPrice);
-
检查是否有价格超过20的书
JSONPath 本身不直接支持返回一个布尔值来表示是否存在满足条件的元素,但你可以在获取结果后判断结果集合是否为空。
JSONPath 表达式:
$.store.book[?(@.price > 20)]
String expensiveBooksPath = "$.store.book[?(@.price > 20)]"; Object expensiveBooks = JsonPath.read(json, expensiveBooksPath); boolean hasExpensiveBooks = ((List<?>) expensiveBooks).size() > 0; System.out.println("Has books priced over 20: " + hasExpensiveBooks);
-
获取bicycle的价格,并判断其是否大于15
首先提取bicycle的价格,然后在Java代码中做比较。
JSONPath 表达式:
$.store.bicycle.price
String bicyclePricePath = "$.store.bicycle.price"; Object bicyclePriceObj = JsonPath.read(json, bicyclePricePath); double bicyclePrice = Double.parseDouble(bicyclePriceObj.toString()); boolean isBicyclePriceGreaterThan15 = bicyclePrice > 15; System.out.println("Is bicycle price greater than 15? " + isBicyclePriceGreaterThan15);
由于JSONPath的具体实现可能有所不同,某些高级功能(如过滤、聚合等)可能不在所有实现中都可用。如果你使用的JsonPath库不支持这些功能,你可能需要在Java代码中实现相应的逻辑。
结语
JSONPath 作为一种强大的 JSON 数据查询语言,为我们提供了便捷的数据定位和提取方式。通过深入学习和实践 JSONPath,我们能够更好地处理和利用 JSON 数据,为应用带来更大的便捷。
相关文章:

深入解析 JSONPath:从入门到精通
码到三十五 : 个人主页 在数据处理和交换领域,JSON已经成为了一种广泛使用的数据格式, 如何有效地查询和操作这些数据也变得越来越重要。在这种情况下,JSONPath 应运而生,成为了一种在JSON数据中定位和提取信息的强大工…...
Python算法设计与分析期末
Python算法设计与分析期末通常涉及对算法基础知识的理解和应用,包括但不限于以下几个方面: 算法基础:了解算法的定义、特性(确定性、有穷性、可行性等)以及算法的分类。 时间复杂度和空间复杂度:学会分析算…...

pg_lakehouse 与 datafusion
原理分析 pg_lakehouse 是 ParadeDB 推出的一个开源插件,支持对多种数据湖里的数据做分析计算。它的出现,使得 Postgres 能够像访问本地数据一样轻松访问 S3 等对象存储,轻松访问 Delta Lake 上的表格,具备数据湖分析能力。 pg_…...

基于51单片机的酒精浓度检测仪的设计
一.硬件方案 硬件部分为利用MQ3气敏传感器测量空气中酒精浓度,并转换为电压信号,经A/D转换器转换成数字信号后传给单片机系统,由单片机及其相应外围电路进行信号的处理,显示酒精浓度值以及超阈值声光报警。电路主要由51单片机最小…...

重生之 SpringBoot3 入门保姆级学习(02、打包部署)
重生之 SpringBoot3 入门保姆级学习(02、打包部署) 1.6 打包插件1.7 测试 jar 包1.8 application.properties 的相关配置 1.6 打包插件 官网链接 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-starte…...
Java-常用模块
文章目录 日期时间stream流 日期时间 jdk8新的日期时间类 解析和格式化DateTimeFormatter类(线程安全) LocalDateTime类 Instant类 Duration类String time "2013-02-11 11:00:00";DateTimeFormatter dateTimeFormatter DateTimeFormatter.o…...
c++大作业 调整字幕的时间
作业及其需求 有时候人们能够下载一些感兴趣的视频但是发现并没有字幕,到字幕网站上查找到字幕文件,但是发现时间进度上不能完美配合,一个视频数据的例子来源于链接: BBC.巴塔哥尼亚:地球秘密乐园 https://www.aliyundrive.com/s/LmF2sgrQzMu/folder/612af030c6fa4bf4b7c…...
Nmap使用方法
Nmap 介绍 Nmap是一个免费开放的网络扫描和嗅探工具包,也叫网络映射器(Network Mapper)。该工具其基本功能有三个,一是探测一组主机是否在线;其次是扫描主机端口,嗅探所提供的网络服务;三是可…...

任务3.1:采用面向对象方式求三角形面积
面向对象编程(OOP)是一种将现实世界中的实体抽象为对象,并通过类和对象来模拟现实世界中的行为和属性的编程范式。在本实战任务中,我们通过创建一个Triangle类来模拟现实世界中的三角形,并使用面向对象的方法来求解三角…...
解读《互联网政务应用安全管理规定》网络和数据安全中的身份认证和审计合规建设
为保障互联网政务应用安全,由中央网络安全和信息化委员会办公室、中央机构编制委员会办公室、工业和信息化部、公安部制定的《互联网政务应用安全管理规定》近日印发,自2024年7月1日起施行。 规定共8章,包括总则、开办和建设、信息安全、网络…...

HTML-JavaWeb
目录 1.标题排版 2.标题样式 编辑 编辑 小结 3.超链接 4.正文排版 编辑编辑编辑5.正文布局 6.表格标签 7.表单标签 8.表单项标签 1.标题排版 ● 图片标签 :< img> src:指定图像的ur1(绝对路径/相对路径) width:图像的宽度(像素/相对于父元素的百…...

数组-检查数组内是否存在和为7的倍数的子序列
一、题目描述 二、解题思路 这里首先要分辨清楚是子序列还是子数组 原数组:[1,2,3,4,5] 子序列:元素和元素之间相对位置保持不变,但是在原数组中不一定连续,如:[1,3,4]; 子数组:元素元素之间保…...

【图像处理与机器视觉】图像处理概述与像素
什么是数字图像处理 改善图像信息,便于作出解释 方便对图像传输,储存,方便机器理解 什么是数字图像 (1)模拟图像:连续二维函数 f(x,y)表示,其中 x…...
虚函数的性能消耗到底在哪?
虚函数的性能消耗 聊到虚函数的性能开销,大家的第一反应肯定是间接调用上,何为间接调用? 当调用一个虚函数时,实际执行的函数版本是在运行时通过虚函数表(virtualtable)查找确定的。这个查找过程是一个间接…...

Visual Studio 的使用
目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…...
Web前端与App前端:深入剖析两者的异同
Web前端与App前端:深入剖析两者的异同 在数字化时代,前端技术已成为连接用户与数字世界的桥梁。然而,当我们谈及前端时,往往会遇到两个相似的概念:Web前端和App前端。这两者是否完全相同,还是各有千秋&…...

初学者必读:Midjourney AI创作工具的简易使用手册!
在数字化时代,AI的应用不断推动着各个领域的发展。在这些领域中,AI在艺术和设计方面的应用引起了广泛的关注。AI绘画软件作为今年的热门,Midjourney 通过其独特的原理和方便的使用方法,为创作者提供了一个全新的创作逼真绘画的平台…...

使用python绘制一个五颜六色的爱心
使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心! 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…...

关于锂电池短路测试
了解锂电池短路测试 电池短路试验测试标准有哪些?宏展告诉你 - 哔哩哔哩 (bilibili.com) 电池电芯上架亚马逊美国站认证标准和要求UL1642测试 - 知乎 (zhihu.com) CR123A电池的短路试验: CR123A电池为例_锂锰电池所需通过的安全性能测试_纽扣电池_锂锰电池_松下电…...

排序(前篇)
1.排序的概念及其运用 2.插入排序的概念及实现 3.希尔排序的概念及实现 4.选择排序概念及实现 总代码(对比各个排序在大量的数据情况排序所化的时间): 1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...