Java中如何通过路径表达式找值:XPath和JsonPath以及SpEL详解及对比

news2024/11/20 19:45:31

大家好,我是G探险者。

我们编程时,在前后端数据交互和传输过程中,往往需要对报文中的某个字段或者某个标签的值进行解析读取,报文通常是以json或者xml作为数据交换格式,而json和xml这两种格式的报文结构都是具备一定的层级关系的,也就是说我们要想要拿到报文里面的某个值,是可以通过一个路径定位到的,那么它们具体是怎么通过路径定位到具体的值呢?

今天咱们就来聊一聊XPath和JsonPath.

1. XPath

XPath,即XML路径语言,是一种用于在XML文档中查找信息的语言。它使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式看起来很像文件系统中的路径,旨在快速地定位和操作文档中的元素。

特点

  • 数据格式: 专用于XML。
  • 查询结构/root/child/grandchild的形式,非常结构化。
  • 表达式能力: 支持逻辑运算、算术运算和内置函数。
  • 使用场景: 主要用于XML文档的导航和查询。

示例代码

假设有以下XML报文:

<books>
   <book>
      <title>Java Programming</title>
      <author>James Gosling</author>
   </book>
   <book>
      <title>XML Fundamentals</title>
      <author>John Doe</author>
   </book>
</books>

使用XPath找到所有书籍的标题:

// 导入所需的XML处理库
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathConstants;
import org.w3c.dom.NodeList;

// ...

// 创建DocumentBuilderFactory实例以解析XML文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建DocumentBuilder实例
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML文档,这里假设文件名为books.xml
Document doc = builder.parse("books.xml");
// 创建XPath实例来查询XML文档
XPath xpath = XPathFactory.newInstance().newXPath();
// XPath表达式,用来选择所有的<title>元素
String expression = "/books/book/title";
// 执行XPath查询并获取结果节点列表
NodeList titles = (NodeList) xpath.evaluate(expression, doc, XPathConstants.NODESET);

// 遍历结果节点列表并打印每个<title>元素的文本内容
for (int i = 0; i < titles.getLength(); i++) {
    System.out.println(titles.item(i).getTextContent());
}

2. JsonPath

JsonPath是从XPath中发展而来的,专门用于JSON数据格式。它提供了一种简单的方法来使用类似XPath的语法,从JSON对象中提取所需的信息。

特点

  • 数据格式: 专用于JSON。
  • 查询结构: 使用点记法(例如$.object.property)或数组记法(例如$['object']['property'])。
  • 表达式能力: 简单,主要用于定位和过滤数据。
  • 使用场景: 处理RESTful服务返回的JSON数据,以及其他JSON数据处理。

示例代码

假设有如下JSON报文:

{
  "store": {
    "book": [
      { "title": "Clean Code", "author": "Robert C. Martin" },
      { "title": "The Pragmatic Programmer", "author": "Andrew Hunt and David Thomas" }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

使用JsonPath获取所有书籍的标题:

首先需要引入这个依赖:

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

// 导入JsonPath库
import com.jayway.jsonpath.JsonPath;
import net.minidev.json.JSONArray;

// ...

// JSON字符串,表示一个书店的存货,包括书籍和自行车
String json = "{ \"store\": { \"book\": [ { \"title\": \"Clean Code\", \"author\": \"Robert C. Martin\" }, { \"title\": \"The Pragmatic Programmer\", \"author\": \"Andrew Hunt and David Thomas\" } ], \"bicycle\": { \"color\": \"red\", \"price\": 19.95 } } }";
// JsonPath表达式,用来选取所有书籍的标题
String jsonPathExpression = "$.store.book[*].title";

// 执行JsonPath查询并获取结果为JSONArray
JSONArray bookTitles = JsonPath.read(json, jsonPathExpression);

// 遍历JSONArray并打印每本书的标题
for (Object title : bookTitles) {
    System.out.println(title);
}

除了上面这个com.jayway.jsonpath 依赖包的方法,还有另外一个依赖包可以处理,官网学习地址:https://github.com/noear/snack3

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>snack3</artifactId>
</<dependency>

3. 拓展

除了以上的XPath和JsonPath,其实还有类似的路径表达式是来从对象中获取某个值
SpEL(Spring Expression Language)和EL(Expression Language)通常用于在Java企业应用中进行动态查询和管理应用程序的行为。
SpEL是Spring框架提供的一种功能强大的表达式语言,而EL最初是为了简化JSP页面的数据展示而生,后来也被整合到了JSF和其他Java企业技术中。

3.1 SpEL

  • 数据格式: 不依赖特定数据格式,可以用于对象图导航。
  • 查询结构: 使用类似于JsonPath的点记法,如@beanName.method()
  • 表达式能力: 非常强大,支持方法调用、关系运算、正则表达式匹配等。
  • 使用场景: 在Spring框架中进行配置、验证、模板操作等,非常灵活。

示例代码:

import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.Expression;

// 创建一个表达式解析器
ExpressionParser parser = new SpelExpressionParser();

// 解析一个字符串表达式,并执行字符串拼接
Expression exp = parser.parseExpression("'Hello World'.concat('!')");
String message = (String) exp.getValue();

// 输出结果,将打印:Hello World!
System.out.println(message);

3.2 EL

  • 数据格式: 不依赖特定数据格式,通常用于访问JavaBeans对象。
  • 查询结构: 使用${object.property}的形式,主要用于Web层。
  • 表达式能力: 相对简单,支持简单的属性访问和算术操作。
  • 使用场景: 主要用于JSP和JSF等Java EE技术中,用于简化页面层的数据展示。
import javax.el.ELProcessor;

// 创建ELProcessor实例
ELProcessor elProcessor = new ELProcessor();

// 定义一个变量并赋值
elProcessor.setValue("greeting", "Hello");

// 使用EL表达式拼接字符串
String result = (String) elProcessor.eval("greeting.concat(' World!')");

// 输出结果,将打印:Hello World!
System.out.println(result);

4. 对比分析

特性XPathJsonPathSpELEL
数据格式XMLJSON任意任意
查询语法结构化路径点记法/数组记法点记法/方法调用简化属性访问
表达式能力逻辑/算术运算定位/过滤方法调用/正则表达式简单属性/算术
使用场景XML文档查询JSON数据处理Spring应用JSP/JSF页面

5. 总结

XPathJsonPath都是强大的查询语言,它们使得从复杂的数据结构中提取信息变得更加容易。XPath适用于XML数据,而JsonPath适用于JSON数据。两者各有优势,具体使用哪一个取决于你的数据格式和需求。在Java中,有多个库可以用来执行XPath和JsonPath查询,如javax.xml.xpathcom.jayway.jsonpath等。

在选择使用哪种表达式语言时,通常取决于你的应用场景和所操作的数据类型。如果你在处理XML或JSON数据,XPath和JsonPath是专门为这些格式设计的。而如果你在Spring框架中工作,SpEL将提供更丰富的功能和更大的灵活性。对于简单的Web页面数据展示,EL是一个轻量级且易于使用的选择。

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

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

相关文章

关于Android音效播放,【备忘】

主要还是希望开箱即用。所以才有了这篇&#xff0c;也是备忘。 以下代码适合Android5.0版本以后 private SoundPool soundPool;//特效播放private Map<String,Integer> soundPoolMap;// Builder buildernew SoundPool.Builder();builder.setMaxStreams(4);///最大…

springboot引入第三方jar包放到项目目录中,添加web.xml

参考博客&#xff1a;https://www.cnblogs.com/mask-xiexie/p/16086612.html https://zhuanlan.zhihu.com/p/587605618 1、在resources目录下新建lib文件夹&#xff0c;将jar包放到lib文件夹中 2、修改pom.xml文件 <dependency><groupId>com.lanren312</grou…

(Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据说明文档下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb…

3D全景视角,足不出户感知真实场景的魅力

近年来&#xff0c;随着科技的快速发展&#xff0c;普通的平面静态视角已经无法满足我们了&#xff0c;不管是视角框架的限制还是片面的环境展示&#xff0c;都不足以让我们深入了解场景环境。随着VR全景技术的日益成熟&#xff0c;3D全景技术的出现为我们提供了全新的视觉体验…

Thrift协议详解

前言特点高效性的体现可拓展性的体现 应用场景示例拓展其他常用协议接口描述语言&#xff08;IDL&#xff09;TBinaryProtocolTCompactProtocolTDebugProtocolTDenseProtocolTJSONProtocol 前言 Thrift协议是一种接口描述语言和二进制通讯协议&#xff0c;它被用来定义和创建跨…

基于传统Session的登录

前言&#xff1a; 本人的一些简历上要回答的点。所以再此整理。 亮点&#xff1a; 使用Filter过滤器进行未登录状态自动跳转到登录页面的拦截&#xff0c;实现统一的权限管理。 1 登陆功能 1.1实体类和结果类 前端页面 约定 res.data.code为1时是登录成功。 数据库的empl…

wangEditor富文本编辑器使用

一、官网 开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单 二、下载安装 npm install --save wangeditor/editor-for-vue 三、在vue中使用 3.1、抽离组件editor.vue 在工程的components目录下新建组件editor <template><div><Toolbar:edi…

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…

神经网络反向传播的数学原理

如果能二秒内在脑袋里解出下面的问题&#xff0c;本文便结束了。 已知&#xff1a;&#xff0c;其中。 求&#xff1a;。 到这里&#xff0c;请耐心看完下面的公式推导&#xff0c;无需长久心里建设。 首先&#xff0c;反向传播的数学原理是“求导的链式法则” : 设f和g为x…

多因素方差分析(Multi-way Analysis of Variance) R实现

1, data0507 flower 是某种植物在两个海拔和两个气温下的开花高度&#xff0c;采用合适 的统计方法&#xff0c;检验该种植物的开花高度在不同的海拔之间和不同的气温之间有无差异&#xff1f;如果有差异&#xff0c;具体如何差异的&#xff1f;&#xff08;说明依据、结论等关…

春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-28512靶场简述二、找注入点三、CVE-2022-28512漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。…

Learning Perception Module

参考文章&#xff1a;自动驾驶开发者说|框架|如何单独运行apollo相机感知模块&#xff1f; - 知乎引言文章主要尝试了apollo框架下&#xff0c;视觉感知模块的单独运行&#xff0c;并利用离线的数据包进行检测实时展示结果。过程相对来说比较顺利。在加上已经用VScode搭建的单步…

springboot321基于java的校园服务平台设计与开发

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

解决:ERROR: No matching distribution found for PIL

解决&#xff1a;ERROR: No matching distribution found for PIL 背景 在搭建之前的代码环境时&#xff0c;报错&#xff1a; ERROR: Could not find a wersion that satisfies the requirement PIL&#xff08;from versions: none&#xff09; ERROR: No matching distribu…

机器视觉系统选型-定光照强度

同一个外形结构的光源&#xff0c;光照强度受如下影响&#xff1a; 单颗灯珠的亮度灯珠排列的数量和密度漫射板/防护板的材质&#xff08;透明、半透明、全漫射&#xff09; 在合理范围内提升光照强度&#xff0c;可降低对相机曝光时长的要求 外形结构尺寸相同的两款光源&am…

基于SSM的古董拍卖系统

基于SSM的古董拍卖系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 拍卖界面 管理员界面 摘要 古董拍卖系统是一个基于SSM框架&#xff08;Spring …

Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7

资料 错误提示&#xff1a; no crontab for root - using an empty one 888 原因剖析&#xff1a; 第一次使用crontab -e 命令时会让我们选择编辑器&#xff0c;很多人会不小心选择默认的nano&#xff08;不好用&#xff09;&#xff0c;或则提示no crontab for root - usin…

Java拼图游戏

运行出的游戏界面如下&#xff1a; 按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…

进程概述

文章目录 计算机算机组成因特尔CPU型号摩尔定律衡量CPU的指标指令&#xff08;Instruction)操作系统&#xff08;Operating System&#xff09;虚拟地址空间&#xff08;Virtual Address Space&#xff09;进程(Process/task)进程管理(PCB - 进程控制块)进程控制块&#xff08;…

一文讲明 Spring 的使用 【全网超详细教程】

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 目录结构 Spring 的相关代码 都公开在…