深入解析 JSONPath:从入门到精通

码到三十五 : 个人主页

在数据处理和交换领域,JSON已经成为了一种广泛使用的数据格式,
如何有效地查询和操作这些数据也变得越来越重要。在这种情况下,JSONPath 应运而生,成为了一种在JSON数据中定位和提取信息的强大工具。

目录

    • 一、什么是 JSONPath
    • 二、JSONPath 基本语法
    • 三、JSONPath 高级特性
    • 四、JSONPath 应用场景
    • 五、JSONPath的使用
    • 结语

一、什么是 JSONPath

JSONPath 是一种在JSON数据中查询信息的表达式语言,它允许用户通过一种简洁明了的语法来定位和提取JSON对象中的特定数据。与XML的XPath类似,JSONPath 提供了一种灵活且强大的方式来查询JSON结构中的数据。

二、JSONPath 基本语法

JSONPath 的语法相对简单,但功能却非常强大。以下是一些基本的语法规则:

  1. $:表示JSON数据的根对象。
  2. .[]:用于访问对象的属性或数组的元素。例如,$.name 或 $[‘name’] 都可以访问根对象中的 ‘name’ 属性。
  3. :表示递归下降,用于查找所有级别的属性。
  4. ?():应用一个过滤表达式来过滤数组中的元素。例如,$?(@.age>18) 将选择所有年龄大于18的对象。
  5. []:在属性名或数组索引位置使用,表示选择所有元素。例如,$.students[*].name 将选择所有学生的名字。
  6. -101n:用作数组索引时,表示从最后一个元素开始计数。例如,$.students[-1].name 将选择最后一个学生的名字。

在这里插入图片描述

三、JSONPath 高级特性

除了基本语法之外,JSONPath 还提供了一些高级特性,使得数据查询更加灵活和强大。

  1. 通配符与切片:你可以使用 * 通配符来选择所有属性,或者使用切片语法(如 [start:end:step])来选择数组中的特定元素范围。
  2. 函数:JSONPath 支持一些内置函数,如 length()(获取数组或字符串长度)、keys()(获取对象所有键)等,这些函数可以在查询中进行更复杂的操作。
  3. 条件表达式:通过结合使用 ?() 和逻辑操作符(如 &&||),你可以构建复杂的条件表达式来过滤数据。

四、JSONPath 应用场景

JSONPath 在多个领域都有广泛的应用,包括但不限于:

  1. 数据验证:通过 JSONPath 表达式,你可以轻松地验证 JSON 数据的结构和内容是否符合预期。
  2. 数据提取与转换:在处理大量 JSON 数据时,JSONPath 可以帮助你快速定位和提取所需信息,或者将数据转换为其他格式。
  3. 自动化测试:在自动化测试中,你可以使用 JSONPath 来验证 API 响应中的数据是否符合预期。
  4. 日志分析:对于包含 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用法:

  1. 提取bicycle的颜色

    JSONPath 表达式: $.store.bicycle.color

    String bicycleColorPath = "$.store.bicycle.color";
    Object bicycleColor = JsonPath.read(json, bicycleColorPath);
    System.out.println("Bicycle Color: " + bicycleColor);
    
  2. 提取不是"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);
    
  3. 提取最贵的书的价格

    为了获取最贵的书的价格,我们可以先获取所有书的价格,然后在应用层面找到最大值。但如果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);
    
  4. 检查是否有价格超过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);
    
  5. 获取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 数据,为应用带来更大的便捷。


听说...关注下面公众号的人都变牛了,纯技术,纯干货 !

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

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

相关文章

【PingPong_注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

(超详细)字符函数和字符串函数【上】

前言 C 语言中对字符和字符串的处理很是频繁&#xff0c;但是 C 语言本身是没有字符串类型的&#xff0c;字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数 . 1.求字符串长度函数 strlen函数 我们要求一个字符串函数的长度…

树--搜索二叉树

现有一棵结点数目为n的二叉树&#xff0c;采用二叉链表的形式存储。对于每个结点均有指向左右孩子的两个指针域&#xff0c;而结点为n的二叉树一共有n-1条有效分支路径。那么&#xff0c;则二叉链表中存在2n-(n-1)n1个空指针域。那么&#xff0c;这些空指针造成了空间浪费。 例…

通过vlan实现同一网段下的网络隔离

现有两个电脑通过交换机直接连接在一起 pc1&#xff1a; pc2&#xff1a; 正常状态下是可以ping成功的 现在先进入交换机命令行界面&#xff0c;创建两个vlan <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]vlan 10 [Huawei-vlan10…

python基础知识总结(第一节)

一、python简介&#xff1a; Python是一种解释型&#xff0c;面向对象的高级语言。 Pyhton的语法和动态类型&#xff0c;以及解释性语言的本质&#xff0c;使它一跃成为多数平台上写脚本和快速开发应用的编程语言。 python语言百度百科介绍 二、Python基础语法&#xff1a;…

交换机的三层交换技术

现有pc1与pc2不在同一个网段之下&#xff0c;通过交换机相连接。 进人交换机1&#xff0c;创建两个vlan 10和vlan 20 &#xff0c;进入串口2设置串口模式为access&#xff0c;并且设置默认vlan为10.进入串口3设置串口模式为access&#xff0c;并且设置默认vlan为20. 进入串口1…

操作系统真象还原:完善MBR

第3章-完善MBR 这是一个网站有所有小节的代码实现&#xff0c;同时也包含了Bochs等文件 编译器给程序中各符号&#xff08;变量名或函数名等&#xff09;分配的地址&#xff0c;就是各符号相对于文件开头的偏移量 。 section 称为节&#xff0c;在有的编译器中&#xff0c;同…

做视频号小店和达人对接的好,爆单少不了!

大家好&#xff0c;我是喷火龙。 目前&#xff0c;视频号是没有什么自然流量的&#xff0c;所以&#xff0c;想要出单、爆单的话&#xff0c;靠达人带货的方式才是最可靠的&#xff0c;靠达人带货是肯定要对接达人&#xff0c;并和达人沟通带货的。 下面给大家讲一讲应该怎么…

【Python】解决Python报错:TypeError: unsupported operand type(s) for ...

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略

文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…

前端应用开发实验:表单控件绑定

目录 实验目的相关知识点实验内容代码实现效果 实验目的 &#xff08;1&#xff09;熟练掌握应用v-model指令实现双向数据绑定的方法&#xff0c;学会使用 v-model指令绑定文本框、复选框、单选按钮、下拉菜单&#xff1b; &#xff08;2&#xff09;学会值绑定&#xff08;将…

Java枚举

引入&#xff1a; 当有一些类&#xff0c;希望它的成员的值是具体的有限的值&#xff0c;且只读不需要修改&#xff0c;不希望用户去自定义其他的值。 比如季节类&#xff0c;它的成员只能是春夏秋冬&#xff0c;不希望用户构造其他的值。 枚举enum&#xff1a; 枚举是一组的特…

SQL数据库多层嵌套 json转sql建表语句,SQL数据库里数组里对象数据怎么创建

1. uniapp sqlite 一个数组包含对象嵌套对象通过主外键方式插入数据库&#xff1a; // 假设有一个对象数组&#xff0c;对象中包含嵌套对象 const objectsArray [{parentObject: {id: 1,name: Parent 1,// 其他父对象属性},childObject: {id: 11,parentId: 1,name: Child 1 o…

字符串操作:写一个方法,实现字符串的反转,如:输入abc,输出cba

import java.util.Scanner; public class Test_A15 {public static void main(String[] args){String strA"";System.out.println("请输入一串字符串:");Scanner scannernew Scanner(System.in);strAscanner.next();Test_A15 T15new Test_A15();String re…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

AI Agent智能体概述及原理

AI Agent概述 AI Agent旨在理解、分析和响应人类输入&#xff0c;像人类一样执行任务、做出决策并与环境互动。它们可以是遵循预定义规则的简单系统&#xff0c;也可以是根据经验学习和适应的复杂、自主的实体&#xff1b;可以是基于软件的实体&#xff0c;也可以是物理实体。…

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…

【YOLOv5/v7改进系列】引入AKConv——即插即用的卷积块

一、导言 介绍了一种名为AKConv&#xff08;Alterable Kernel Convolution&#xff09;的新型卷积操作&#xff0c;旨在解决标准卷积操作存在的两个根本性问题。首先&#xff0c;标准卷积操作受限于局部窗口&#xff0c;无法捕获来自其他位置的信息&#xff0c;且其采样形状固…

Facebook隐私保护:数据安全的前沿挑战

在数字化时代&#xff0c;随着社交媒体的普及和应用&#xff0c;个人数据的隐私保护问题日益受到关注。作为全球最大的社交平台之一&#xff0c;Facebook承载了数十亿用户的社交活动和信息交流&#xff0c;但与此同时&#xff0c;也面临着来自内外部的数据安全挑战。本文将深入…

玄机平台应急响应—Linux入侵排查

1、前言 这篇文章主要说一下linux的入侵排查&#xff0c;也就是说当你的服务器已经被入侵的时候&#xff0c;该如何去排查使其恢复正常。下面是排查的步骤&#xff0c;但是实际情况往往更为复杂&#xff0c;需要进一步来分析&#xff0c;而不是无脑的按照步骤来敲就完事了。 …