Java利用JSONPath操作JSON数据的技术指南

 更新时间:2025年04月01日 08:50:00   作者:拾荒的小海螺  
JSONPath 是一种强大的工具,用于查询和操作 JSON 数据,类似于 SQL 的语法,它为处理复杂的 JSON 数据结构提供了简单且高效的解决方案,本文将介绍 JSONPath 的基本语法,并通过详细的 Java 示例展示其实际应用,需要的朋友可以参考下

1、简述

JSONPath 是一种强大的工具,用于查询和操作 JSON 数据。类似于 SQL 的语法,它为处理复杂的 JSON 数据结构提供了简单且高效的解决方案。

本文将介绍 JSONPath 的基本语法,并通过详细的 Java 示例展示其实际应用。

2、什么是 JSONPath?

JSONPath 是一种用于 JSON 文档的路径表达式语言,类似于 XPath(用于 XML)。它允许我们:

  • 提取 JSON 中的值
  • 过滤和操作数据
  • 遍历嵌套结构

基本语法规则:

JSONPath 表达式功能说明
$根对象
. 或 []访问子元素
*通配符,匹配所有元素
..递归搜索
?()过滤表达式
@当前元素

在使用 JSONPath 之前,需要添加其依赖。以下是 JSONPath 的 Maven 依赖:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.8.0</version>
</dependency>

3、Java 示例

在 Java 中,我们可以使用开源库 Jayway JSONPath 来实现 JSONPath 的功能。以下示例 JSON 数据:

{
  "store": {
    "book": [
      { "category": "fiction", "author": "John", "price": 10.99 },
      { "category": "science", "author": "Jane", "price": 12.99 },
      { "category": "fiction", "author": "George", "price": 8.99 }
    ],
    "bicycle": {
      "color": "red",
      "price": 99.99
    }
  }
}

3.1 基本查询

从 JSON 中获取所有书籍的类别。

import com.jayway.jsonpath.JsonPath;
import java.util.List;

public class JSONPathDemo {
    public static void main(String[] args) {
        String json = """
        {
          "store": {
            "book": [
              { "category": "fiction", "author": "John", "price": 10.99 },
              { "category": "science", "author": "Jane", "price": 12.99 },
              { "category": "fiction", "author": "George", "price": 8.99 }
            ]
          }
        }
        """;

        List<String> categories = JsonPath.read(json, "$.store.book[*].category");
        System.out.println("📚书籍类别: " + categories);
    }
}

输出:

书籍类别: [fiction, science, fiction]

3.2 过滤查询

获取价格大于 10 的书籍。

List<Map<String, Object>> expensiveBooks = JsonPath.read(json, "$.store.book[?(@.price > 10)]");
System.out.println("💰价格大于 10 的书籍: " + expensiveBooks);

输出:

价格大于 10 的书籍: [{category=fiction, author=John, price=10.99}, {category=science, author=Jane, price=12.99}]

3.3 递归搜索

获取所有价格字段。

List<Double> prices = JsonPath.read(json, "$.store..price");
System.out.println("💵所有价格: " + prices);

输出:

所有价格: [10.99, 12.99, 8.99, 99.99]

3.4 嵌套查询

获取自行车的颜色。

String color = JsonPath.read(json, "$.store.bicycle.color");
System.out.println("🚲自行车颜色: " + color);

输出:

自行车颜色: red

3.5 结合 POJO 使用

将查询结果映射到 Java 对象中。

import com.fasterxml.jackson.databind.ObjectMapper;

class Book {
    private String category;
    private String author;
    private double price;

    // Getters and Setters
}

List<Book> books = JsonPath.parse(json).read("$.store.book[*]", new TypeRef<List<Book>>() {});
books.forEach(book -> System.out.println("📖书籍: " + book.getCategory() + " by " + book.getAuthor()));

4、高级用法

4.1 动态路径

根据用户输入动态生成 JSONPath 表达式。

String category = "fiction";
String jsonPath = String.format("$.store.book[?(@.category == '%s')]", category);
List<Map<String, Object>> result = JsonPath.read(json, jsonPath);
System.out.println("🔍查询结果: " + result);

4.2 自定义函数

通过扩展 JSONPath 的功能,实现复杂逻辑。

Configuration conf = Configuration.builder()
        .options(Option.DEFAULT_PATH_LEAF_TO_NULL)
        .functions(new CustomFunctions())
        .build();
DocumentContext context = JsonPath.using(conf).parse(json);

5、总结

JSONPath 是处理 JSON 数据的利器,其直观的语法和强大的功能使得 JSON 数据操作变得轻松自如。通过结合 Java 和第三方库,可以在各种场景下高效应用 JSONPath。

以上就是Java利用JSONPath操作JSON数据的技术指南的详细内容,更多关于Java JSONPath操作JSON数据的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot集成Redis流程详解

    SpringBoot集成Redis流程详解

    这篇文章主要介绍了SpringBoot集成Redis流程详解,导入jar包,编写配置类,编写util类,配置yml这四个步骤,有详细的代码示例,,需要的朋友可以参考下
    2023-05-05
  • java开发AOP基础JdkDynamicAopProxy

    java开发AOP基础JdkDynamicAopProxy

    这篇文章主要为大家介绍了java开发AOP基础JdkDynamicAopProxy源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 使用JAVA命令运行JAR包以及日志输出详解

    使用JAVA命令运行JAR包以及日志输出详解

    这篇文章主要给大家介绍了关于使用JAVA命令运行JAR包以及日志输出的相关资料,文中通过代码示例介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java 线程创建方式全过程

    Java 线程创建方式全过程

    本文介绍了继承Thread类、实现Runnable接口和Callable接口创建线程的方法,以及线程池的使用理逻辑和任务处理机制,并重点讲解了线程池参数配置、常用阻塞队列和拒绝策略、线程池的优势和应用场景、虚拟线程的特点和创建方法、ScheduledThreadPool线程池原理和使用方法
    2026-05-05
  • springboot配置templates直接访问的实现

    springboot配置templates直接访问的实现

    这篇文章主要介绍了springboot配置templates直接访问的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 冒泡排序的原理及java代码实现

    冒泡排序的原理及java代码实现

    冒泡排序法:关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底。算法本质:(最大值是关键点,肯定放到最后了,如此循环)每次都从第一位向后滚动比较,使最大值沉底,最小值上升一次,最后一位向前推进
    2016-02-02
  • JAVA反射机制实例教程

    JAVA反射机制实例教程

    这篇文章主要介绍了JAVA反射机制,包括了Java反射机制的各种应用技巧,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • 解决警告:No archetype found in remote catalog. Defaulting to internal catalog.问题

    解决警告:No archetype found in remote c

    新建Maven项目时,若提示远程archetype未找到,可通过以下两种方式解决:一是检查网络或仓库配置;二是设置VMOptions参数-DarchetypeCatalog=internal,强制使用内部目录
    2025-08-08
  • 详解mybatis批量插入10万条数据的优化过程

    详解mybatis批量插入10万条数据的优化过程

    这篇文章主要介绍了详解mybatis批量插入10万条数据的优化过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java实战之超市收银管理系统的实现

    Java实战之超市收银管理系统的实现

    这篇文章主要介绍了如何利用Java实现超市收银管理系统,文中采用的技术有:Spring、SpringMVC、MyBatis、ThymeLeaf等,需要的可以参考一下
    2022-03-03

最新评论