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

1、简述

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

代码样例:https://gitee.com/lhdxhl/springboot-example.git

本文将介绍 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。

希望本文的内容对您有所帮助!🎉

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

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

相关文章

服务器磁盘卷组缓存cache设置介绍

工具1&#xff1a; storcli a. 确认软件包是否安装 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 备注&#xff1a;若检索结果为空&#xff0c;需要安装对应的软件安装包。安装命令如下&#xff1a; #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看逻辑…

java项目分享-分布式电商项目附软件链接

今天来分享一下github上最热门的开源电商项目安装部署&#xff0c;star 12.2k&#xff0c;自行安装部署历时两天&#xff0c;看了这篇文章快的话半天搞定&#xff01;该踩的坑都踩完了&#xff0c;软件也打包好了就差喂嘴里。 项目简介 mall-swarm是一套微服务商城系统&#xf…

QtWebApp使用

QtWebApp 是一个轻量级的 HTTP 服务器库,基于 Qt 网络模块(QTcpServer 和 QTcpSocket)实现,适用于嵌入式设备、本地服务或需要快速搭建 Web 接口的 Qt 应用程序。 1. 核心功能 HTTP/1.1 服务器 支持 GET、POST、PUT、DELETE 等标准 HTTP 方法。 解析请求头、查询参数(Qu…

用Rust和WebAssembly打造轻量级前端加密工具

开头聊两句 最近在折腾前端项目时&#xff0c;发现一个问题&#xff1a;很多时候需要在浏览器里做点加密作&#xff0c;比如保护用户输入的数据&#xff0c;但JavaScript跑起来总感觉慢吞吞的。于是我开始琢磨&#xff0c;能不能用Rust写个高性能的加密模块&#xff0c;再通过W…

Linux NUC小主机化身视频会议服务器: 技术优势与部署实战

在远程办公常态化背景下&#xff0c;视频会议系统对硬件的轻量化、低功耗与稳定性提出了更高要求。基于Intel NUC&#xff08;Next Unit of Computing&#xff09;打造的Linux服务器方案&#xff0c;凭借其高性能、低能耗和可扩展性优势&#xff0c;正成为中小企业搭建视频会议…

idea查看class字节码

概述 如何查看class字节码&#xff1f;话不多说&#xff0c;直接看示例&#xff01; 方法一 选中class类&#xff0c;然后选择 View -> Show Bytecode 方法二 安装jclasslib插件 方法三 Settings -> Tools -> External Tools 添加一个tool //指定javap.exe路…

python使用cookie、session、selenium实现网站登录(爬取信息)

一、使用cookie 这段代码演示了如何使用Python的urllib和http.cookiejar模块来实现网站的模拟登录&#xff0c;并在登录后访问需要认证的页面。 # 导入必要的库 import requests from urllib import request, parse# 1. 导入http.cookiejar模块中的CookieJar类&#xff0c;用…

机器人基础知识-1

1.六轴机器人中的六轴是什么&#xff1f; 第一轴&#xff08;J1&#xff09;&#xff1a;底座旋转 控制机器人整体绕垂直轴旋转&#xff08;左右摆动&#xff09;&#xff0c;决定工作范围的水平方向。 第二轴&#xff08;J2&#xff09;&#xff1a;下臂前后摆动 驱动机器人的…

将代理连接到 Elasticsearch 使用模型上下文协议

作者&#xff1a;来自 Elastic Jedr Blaszyk 及 Joe McElroy 让我们使用 Model Context Protocol 服务器 与 你的 数据 在 Elasticsearch 中聊天。 如果与你的数据交互像与同事聊天一样轻松&#xff0c;会怎样&#xff1f;想象一下&#xff0c;你只需简单地问&#xff1a;“显…

Vue 组件 - 动态组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 组件 - 动态组件 目录 动态组件 选项卡页面示例 更简单写法 增加输入框 弥补措施 总结 动态组件 选项卡页面示例 功能&#xff1a;选项卡功能&#xff0c;设置导航点击哪个显示相应页面。 设置三个全局组件&#…

Telnet协议详解:本质与操作逻辑

一、Telnet的本质 1. 协议定位 Telnet是一种基于TCP的明文远程终端控制协议&#xff0c;属于应用层协议。其核心功能是通过网络模拟物理终端&#xff0c;实现对远程主机的命令行控制。 2. 核心特性 网络虚拟终端&#xff08;NVT&#xff09;&#xff1a;建立统一的字符编码标…

Android 使用CameraX实现预览、拍照、录制视频(Java版)

Android 官方关于相机的介绍如下&#xff1a; https://developer.android.google.cn/media/camera/get-started-with-camera?hlzh_cn 一、开始使用 Android 相机 Android相机一般包含前置摄像头和后置摄像头&#xff0c;使用相机可以开发一系列激动人心的应用&#xff0c;例…

面向对象

一、Scala包 1、基本语法 package 包名 2、Scala 包的三大作用&#xff08;和 Java 一样&#xff09; &#xff08;1&#xff09;区分相同名字的类 &#xff08;2&#xff09;当类很多时&#xff0c;可以很好的管理类 &#xff08;3&#xff09;控制访问范围 二、包说明 1、说明…

MySQL多表联查

一、数据库表结构 假设我们有两个表&#xff1a;users 和 orders&#xff0c;users 表存储用户信息&#xff0c;orders 表存储订单信息&#xff0c;一个用户可以有多个订单&#xff0c;通过 user_id 关联两个表。 users 表 字段名数据类型描述user_idINT用户 ID&#xff0c;…

如何迁移AxureCloud到新服务器?

前言 常有朋友遇到在更换服务器时或者本地AxureCloud迁移到服务器上时&#xff0c;如何正确迁移AxureCloud&#xff0c;让原有的原型可以正常访问呢&#xff1f; 事前准备 Navicat&#xff1a;用于迁移数据库。 AxureCloud&#xff1a;和原安装版本一致。 MySQL&#xff1…

CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例

csgo-market/ ├── pom.xml (or build.gradle) └── src/└── main/├── java/│ └── com/│ └── yourcompany/│ └── csgomarket/│ ├── CsgomarketApplication.java # Spring Boot 启动类│ ├── conf…

mac Python多版本第三方库的安装路径

终端查看python版本是 3.12&#xff0c;但是pycharm使用的python版本是 3.9 终端正常安装包以后&#xff0c;pycharm都可以正常使用&#xff0c;但是将 pycharm的python换成 3.12 版本&#xff0c;之前安装的库都没有了 通过终端查看安装库的位置&#xff0c;确实是安装到py…

Java常用异步方式总结

使用建议 完整代码见https://gitee.com/pinetree-cpu/parent-demon 提供了postMan调试json文件于security-demo/src/main/resources/test_file/java-async.postman_collection.json 可导入postMan中进行调试 Java异步方式以及使用场景 继承Thread类 新建三个类继承Thread&…

【VUE3】Pinia

目录 0前言 1 手动添加Pinia 2 创建与使用仓库&#xff08;Setup Store 组合式&#xff09; 2.1 创建仓库 2.2 使用仓库数据 2.3 解构响应式数据 3 持久化插件 0前言 官网&#xff1a;Pinia | The intuitive store for Vue.js 1 手动添加Pinia 上手之后&#xff0c;可…

JVM 每个区域分别存储什么数据?

JVM&#xff08;Java Virtual Machine&#xff09;的运行时数据区&#xff08;Runtime Data Areas&#xff09;被划分为几个不同的区域&#xff0c;每个区域都有其特定的用途和存储的数据类型。以下是 JVM 各个区域存储数据的详细说明&#xff1a; 1. 程序计数器 (Program Cou…