Java操作JsonPath的详细指南

 更新时间:2025年05月27日 14:31:39   作者:MadeInSQL  
JSONPath 是一种在JSON数据中查询信息的表达式语言,它允许用户通过一种简洁明了的语法来定位和提取JSON对象中的特定数据,本文给大家介绍Java操作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 可以帮助你快速提取和分析关键信息。

Java操作JsonPath库

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.7.0</version> <!-- 请检查是否有更新的版本 -->
</dependency>
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代码中实现相应的逻辑。

到此这篇关于Java操作JsonPath的文章就介绍到这了,更多相关Java操作JsonPath内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java数据结构与算法之noDups去除重复项算法示例

    java数据结构与算法之noDups去除重复项算法示例

    这篇文章主要介绍了java数据结构与算法之noDups去除重复项算法实现技巧,程序代码非常简单,关键在于循环与判定,需要的朋友可以参考下
    2016-08-08
  • java进行远程部署与调试及原理详解

    java进行远程部署与调试及原理详解

    这篇文章主要介绍了java进行远程部署与调试及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java springboot里注解大全和使用指南(最新整理)

    Java springboot里注解大全和使用指南(最新整理)

    在Java Spring Boot中,注解是简化开发、提高效率的关键工具,这篇文章给大家介绍Java springboot里注解大全和使用指南,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-03-03
  • LeetCode 动态规划之矩阵区域和详情

    LeetCode 动态规划之矩阵区域和详情

    这篇文章主要介绍了LeetCode 动态规划之矩阵区域和详情,文章基于Java的相关资料展开对LeetCode 动态规划的详细介绍,需要的小伙伴可以参考一下
    2022-04-04
  • Kotlin内存陷阱inline使用技巧示例详解

    Kotlin内存陷阱inline使用技巧示例详解

    这篇文章主要为大家介绍了Kotlin内存陷阱inline使用技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • idea插件篇之java内存分析工具(JProfiler)的使用

    idea插件篇之java内存分析工具(JProfiler)的使用

    这篇文章主要介绍了idea插件篇之java内存分析工具(JProfiler),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • idea创建spring boot项目及java版本只能选择17和21的问题

    idea创建spring boot项目及java版本只能选择17和21的问题

    这篇文章主要介绍了idea创建spring boot项目及java版本只能选择17和21的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • java数组实现队列及环形队列实现过程解析

    java数组实现队列及环形队列实现过程解析

    这篇文章主要介绍了java数组实现队列及环形队列实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Apache SkyWalking 修复TTL timer 失效bug详解

    Apache SkyWalking 修复TTL timer 失效bug详解

    这篇文章主要为大家介绍了Apache SkyWalking 修复TTL timer 失效bug详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • java 设计模式之单例的实例详解

    java 设计模式之单例的实例详解

    这篇文章主要介绍了java 设计模式之单例的实例详解的相关资料, 希望通过本文能帮助到大家,让大家彻底理解掌握单例模式,需要的朋友可以参考下
    2017-09-09

最新评论