Java 的 Jsonpath 库
创始人
2025-05-30 22:52:04

Jsonpath 算是很基本的技术工具,不过我过去主要是在 PostgreSQL 数据库中使用。近期的工作中要在 Java 层面处理一些复杂的 Json 结构,于是找到了一个 JsonPath 工具库 https://github.com/json-path/JsonPath 。

在这里不多讨论 Jsonpath 的语法了,可以参考各种相关的文档,需要注意的是,因为 Jsonpath 是一个相对没那么热门的概念,所以不同的 Jsonpath 解释器实现的功能会有些细节上的区别,要经过测试才能确定使用。

这个库的使用体验非常好,提供了不同灵活性和复杂度的接口。不过有些细节还是比较单薄的,后面我们具体情况具体讨论。这里不多展开它文档上着重介绍的那些,介绍一些相对来说不容易第一时间发现的。

基本用法

如果我们只是简单的从 JSON 文本中提取指定路径的内容,那么类似下面这个例子就足够用了。

import com.jayway.jsonpath.JsonPath;
// ... 
List authors = JsonPath.read(json, "$.store.book[*].author");

需要注意的是,查询中有些位置是不能有空格的,比如正则表达式。这个我没有在文档里看到,但是实测确实会出问题。好在正则表达式中我们可以用 \s 代表空格。需要注意的是,根据正则表达式所在的内容深度,要记得补全对应的转义符。也就是说,我们实际要写作 \\s:

JsonPath.read(json, "$..book[?(@.author =~ /^J\\.\\s.*?/i)]");
//  [{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]

这里有个细节,就是它会自动转换 List(对应 Json Array),Map 和 Java 基本类型以及文本对应的那些类型,如果需要更复杂的类型映射,可以参考后面的内容。

预编译查询

对于反复使用的 Jsonpath 查询,我们可以预先编译为一个 JsonPath

JsonPath query =JsonPath.compile("$.data.items");
List books = query.read(content);

预编译文档

反过来说,重复使用的文档,也可以预处理:

 DocumentContext doc =JsonPath.parse(content);Integer size = doc.read("$.data.items.length()");

类型映射

前面说过,对于基本类型和结构,JsonPath 可以直接处理,那么我们的自定义类型呢?其实是可以通过配置 JsonProvider 和 MapProvider 来解决。这个机制还是相当透明的。默认情况下,它使用自己的 JsonProvider 和 MapProvider ,但是也支持持用 Jackson 和 Gson :

import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.TypeRef;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
// ...
Configuration jsonPathConfig =Configuration.builder().jsonProvider(newJacksonJsonProvider(config.objectMapper())).mappingProvider(newJacksonMappingProvider(config.objectMapper())).build();
finalTypeRef> itemsRef =newTypeRef>() {};
// ...
List items =JsonPath.using(jsonPathConfig).parse(content).read("$.data.items", itemsRef);

这是我在工作中使用的一段测试代码,content 的实际内容和 ContentItem 的内部结构我们不需要关心,重点在于我们通过 TypeRef 绕过了擦拭法,将具体的列表元素类型传递给了 JsonPath 程序。这里我用的是 Jackson,Gson 用户换对应的设置即可。从代码实现上看,这些 Provider 并不复杂,FastJson 等未支持的 Json 库,用户自己写出对应的 Provider 也并不困难。

需要注意的有两处,一个是我们必须同时提供 JsonProvider 和 MapProvider,否则它还是会调用内置的 JsonSmartJsonProvider 。然后在构造复杂类型时候报错:

jsonPathConfig =Configuration.builder().jsonProvider(newJacksonJsonProvider(config.objectMapper()))//.mappingProvider(new JacksonMappingProvider(config.objectMapper())).build();
// ...
List items =JsonPath.using(jsonPathConfig).parse(content).read("$.data.items", itemsRef);
//java.lang.UnsupportedOperationException: Json-smart provider does not support TypeRef! Use a Jackson or Gson based provider

这个例子中,我注释了 JacksonMappingProvider 的配置,但是抛出的异常提示的是 JsonProvider 问题。这里的信息是有点儿误导的。

这里还有一个细节是,构造 JacksonMappingProvider 的时候,我们可以传递自己的 ObjectMapper 进去,这就可以让我们统一配置 JsonPath 和 Jackson 的处理行为。

安装

JsonPath 的安装没有什么特殊的,正常的 maven 库:

com.jayway.jsonpathjson-path2.7.0

相关内容

热门资讯

城市住房产品力变化 | 探索“... 记者 田国宝 编者按:推开一扇门,有人看见三代同堂的烟火,有人撞见独自拼凑的晨昏,有人在精装样板间描...
破发股爱科赛博5高管拟减持 2... 中国经济网北京6月6日讯 爱科赛博(688719.SH)昨晚发布董事、高级管理人员减持股份计划公告。...
2025年前5月私募证券基金备... 2025年私募证券基金市场展现出强劲复苏势头。前5个月全行业累计备案私募证券基金4361只,较去年同...
始于雷军、困于罗永浩、终于董明... 在孟羽童和董明珠“世纪和解”重回格力直播后,沉寂了近一年的王自如在社交平台露面了。 6月5日晚,王自...
霸王茶姬首份成绩单背后,如何从... 如今的新茶饮市场高度内卷,价格战频发,霸王茶姬凭什么能做到稳健增长?文|《中国企业家》记者胡楠楠编辑...
金陵饭店2024年净利润下滑4... 本报记者 李贝贝 上海报道2024年,金陵饭店股份有限公司(下称“金陵饭店”,601007.SH)归...
3年卖掉69座电站!林洋能源再... 本报(chinatimes.net.cn)记者李佳佳 李未来 北京报道近期,江苏林洋能源股份有限公司...
高考考点:二桃杀三士 如何应对... 祝各位考生高考节快乐。上次讲崔杼弑其君,星空君故意漏了一个细节。齐庄公死后,著名的退居二线的大夫晏婴...
非农数据提振市场,美国三大股指... 美股周五收高,道指上涨逾400点,标普500指数突破6000点整数关口。三大股指本周均录得涨幅。Wi...
美股上攻,黄金下跌超1% 美股... 2025.06.07本文字数:2393,阅读时长大约4分钟作者 |第一财经 樊志菁*三大股指涨超1%...
加力支持 精准滴灌 多方协同—...   新华社北京6月6日电 题:加力支持 精准滴灌 多方协同——金融护航外贸发展观察   新华社记者姚...
卖出600万只枕头的亚朵,栽在... 「核心提示」一只枕套,将加盟商和亚朵之间利益共生又充满矛盾的关系摆到了台面上。作者 |詹方歌邢昀一年...
“天价耳环事件”最新消息!“黄... 近期,因“天价耳环”事件备受关注的黄杨钿甜及其父亲杨伟持续引发热议。有网友发现其父杨伟在公开回应前,...
年轻人涌入医院买面包?为啥医院... 说起最近几年,各种消费热点中有一类非常特殊,这就是医院成为了不少消费的热点,各种中药咖啡、中药饮料、...
金穗春操纵股票遭证监会罚没过亿... 6月6日晚间,证监会披露的一则行政处罚决定书(2025 59号)显示,金穗春(男)操纵股票被证监会罚...
证监会核准中央汇金成为8家公司... 南财早新闻,早听早知道。1、上交所召开高分红重回报暨上市公司价值提升座谈会。上交所相关负责人表示,未...
信托业破局价格“内卷”:少赚吆... 1万元就可以做一单资产证券化业务——信托本源业务的低价“内卷”,正困扰着信托公司。 随着信托业转型加...
每周股票复盘:爱博医疗(688... 截至2025年6月6日收盘,爱博医疗(688050)报收于71.05元,较上周的71.41元下跌0....
大转向!外资,爆买! 大转向如... 外资突然出现重大转变。在连续四个月净卖出后,外资在5月大举押注亚洲股市。据伦敦证券交易所集团(LSE...
不想对话!特朗普余气未消,特斯... 在双方爆发激烈“口水战”后,美国总统特朗普与特斯拉首席执行官(CEO)马斯克并未如外界期望的那样在周...
惊天大骗局,一万人踩雷 惊天大... 一万多人辛苦一辈子的血汗钱瞬间化为乌有。这再次说明了,天上不会掉馅饼。所有的投资都要基于常识,正如中...
广州农商银行60后副行长再担重... 担任广州农商银行副行长三年多后,李亚光再添职务,其首席信息官的任职资格获批。湘财Plus注意到,李亚...
标普500收复6000点!美股... *三大股指涨超1%;*加拿大产区大火持续,原油延续反弹;*特斯拉反弹超3%,市场关注特朗普与马斯克关...
诺诚健华涨2.42%,成交额1... 6月6日,诺诚健华涨2.42%,成交额1.28亿元,换手率2.01%,总市值432.89亿元。 异动...
远光软件跌0.34%,成交额1... 6月6日,远光软件跌0.34%,成交额1.72亿元,换手率1.72%,总市值111.83亿元。 异动...
非农数据提振市场,美国三大股指...   中新经纬6月7日电 美股周五收高,道指上涨逾400点,标普500指数突破6000点整数关口。三大...
每周股票复盘:招商银行(600... 截至2025年6月6日收盘,招商银行(600036)报收于44.47元,较上周的43.43元上涨2....
小阔集团董事长尹阔:民营经济促... 中国经济网北京6月6日讯(记者 李方)“民营经济促进法犹如一颗‘定心丸’,为我们营造了一个稳定、公平...
Circle纽交所上市:大涨1... 雷递网 雷建平 6月6日 USDC稳定币发行商Circle(股票代码为:“CRCL”)昨日在纽交所上...
招商银行成功发行50亿绿色金融... 2025年6月5日,在第54个“世界环境日”到来之际,招商银行在全国银行间债券市场成功簿记发行绿色金...