snack4-jsonpath v4.0.36 发布(支持 IETF RFC 9535 标准)

提供 Json Dom 的构建、编码解转换(序列化)、获取、JsonPath 查询、JsonSchema 验证等功能。

xml 复制代码
<dependency>
  <groupId>org.noear</groupId>
  <artifactId>snack4-jsonpath</artifactId>
  <version>4.0.36</version>
</dependency>

Snack-Jsonpath 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计。其下一切数据都以ONode表示,ONode也即 One node 之意,代表任何类型,也可以转换为任何类型。

  • 强调文档树的构建和操控能力
  • 高性能Json path查询(比 jayway.jsonpath 快很多倍)。同时兼容 jayway.jsonpathIETF JSONPath (RFC 9535) 标准 (用 options 切换)。为下一个十年提供强劲的 JsonPath 体验。
  • 支持 Json schema 架构校验
  • 支持 json5 部分特性(无键字段,注释,等...)
  • 优先使用 无参构造函数 + 字段 编解码(可减少注入而触发动作的风险)
  • 支持 java8 到 java25

依赖包清单:

依赖包 描述
org.noear:snack4 提供 json dom 构建和编解码支持
org.noear:snack4-jsonpath 提供 json path 查询支持
org.noear:snack4-jsonschema 提供 json schema 校验支持

开源项目仓库地址:

文档资料:

1、最近更新

  • 添加 snack4 Json Feature.Read_TrimString 特性
  • 添加 snack4 JsonReader.iterableNext 方法(支持 json 流式读取,特别适配 llm stream 输出)
  • 添加 snack4 JsonReader.readLast 方法
  • 添加 snack4 ONode 字段类型反序列化支持
  • 添加 snack4 自定义注解获取支持
  • 添加 snack4 Options.then 方法,用于链式构建
  • 添加 snack4 CodecLib.patternCreators,patternDecoders,patternEncoders 去重处理
  • 添加 snack4 MapperLib.schemaPatternMappers,typePatternMappers 去重处理
  • 添加 snack4 AtomicBoolean,AtomicLong,AtomicInteger 支持
  • 添加 snack4 Optional 内置编解码器支持(也可以自定义扩展)
  • 添加 snack4 ONode:delete 方法,协助 jsonpath 删除
  • 添加 snack4-jsonschema JsonSchema 默认值生成
  • 添加 snack4-jsonschema 类型映射机制,支持 Future,Optional 等包装或传递类型
  • 优化 snack4 Iterable 支持(替代之前的 Collection)
  • 优化 snack4 反序列化自动移除 '@type' 属性申明
  • 优化 snack4-jsonpath 逻辑表达式兼容性支持无空隔的 "a=='a'"
  • 优化 snack4-jsonschema Optional 类型处理
  • 调整 snack4 JsonReader.streamRead 更名为 readNext(前者标为弃用)
  • 调整 snack4-jsonpath JsonPath.delete 改为返回 bool(之前为 void)
  • 修复 snack4 ONode.ofBean 和 ofJson 传入 null 会异常的问题
  • 修复 snack4 Json BeanDecoder array.item 为 null 不能原还的问题(补过滤了)
  • 修复 snack4-jsonschema JsonSchema TypeRule.getSchemaTypeName 没有把初始节点识别为 null 的问题(识别为 undefined 了)
  • 修复 snack4-jsonpath JsonPathProvider:delete(root, path) 删除多个 arrray index 时会超界的问题

2、JSONPath 语法参考

语法元素 描述
$ 根节点标识符
@ 当前节点标识符(仅在过滤选择器中有效)
[<selectors>] 子段:选择节点的零个或多个子节点
.name 简写 ['name']
.* 简写 [*]
..[<selectors>] 后代段:选择节点的零个或多个后代
..name 简写 ..['name']
..* 简写 ..[*]
'name' 名称选择器:选择对象的命名子对象
* 通配符选择器:选择节点的所有子节点
3 索引选择器:选择数组的索引子项(从 0 开始)
0:100:5 数组切片选择器:数组的 start:end:step
?<logical-expr> 过滤选择器:使用逻辑表达式选择特定的子项
fun(@.foo) 过滤函数:在过滤表达式中调用函数(IETF 标准)
.fun() 聚合函数:作为片段使用(jayway 风格)

过滤选择器语法参考:

语法 描述 优先级
(...) 分组 5
name(...) 函数扩展 5
! 逻辑 4
==,!=,<,<=,>,>= 关系比较符 3
&& 逻辑 2
` `

IETF JSONPath (RFC 9535) 标准定义操作符(支持)

操作符 描述 示例
== 左等于右(注意1不等于'1') $[?(@.a == 1)]
!= 左不等于右 $[?(@.a != 1)]
< 左比右小 $[?(@.a < 1)]
<= 左小于或等于右 $[?(@.a <= 1)]
> 左大于右 $[?(@.a > 1)]
>= 左大于等于右 $[?(@.a >= 1)]

jayway.jsonpath 增量操作符(支持)

操作符 描述 示例
=~ 左匹配正则表达式 [?(@.s =~ /foo.*?/i)]
in 左存在于右 [?(@.s in ['S', 'M'])]
nin 左不存在于右
subsetof 左是右的子集 [?(@.s subsetof ['S', 'M', 'L'])]
anyof 左与右有一个交点 [?(@.s anyof ['M', 'L'])]
noneof 左与右没有交集 [?(@.s noneof ['M', 'L'])]
size 左(数组或字符串)的大小应该与右匹配 $[?(@.s size @.expected_size)]
empty Left(数组或字符串)应该为空 $[?(@.s empty false)]

IETF JSONPath (RFC 9535) 标准定义函数(支持)

函数 描述 参数类型 结果类型
length(x) 字符串、数组或对象的长度 数值
count(x) 节点列表的大小 节点列表 数值
match(x,y) 正则表达式完全匹配 值,值 逻辑值
search(x,y) 正则表达式子字符串匹配 值,值 逻辑值
value(x) 节点列表中单个节点的值 节点列表

jayway.jsonpath 函数(支持)

函数 描述 输出类型
length() 字符串、数组或对象的长度 Integer
min() 查找当前数值数组中的最小值 Double
max() 查找当前数值数组中的最大值 Double
avg() 计算当前数值数组中的平均值 Double
stddev() 计算当前数值数组中的标准差 Double
sum() 计算当前数值数组中的总和 Double
keys() 计算当前对象的属性键集合 Set<E>
concat(X) 将一个项或集合和当前数组连接成一个新数组 like input
append(X) 将一个项或集合 追加到当前路径的输出数组中 like input
first() 返回当前数组的第一个元素 依赖于数组元素类型
last() 返回当前数组的最后一个元素 依赖于数组元素类型
index(X) 返回当前数组中索引为X的元素。X可以是负数(从末尾开始计算) 依赖于数组元素类型
相关推荐
巫山老妖1 小时前
OpenClaw 技术教程大全:从安装到多 Agent 协作,全在这里
java·前端
于眠牧北1 小时前
Jmeter发送POST请求并设置application/json格式
jmeter·json
xiaogg36781 小时前
springboot3+vue3+elementPlus+minio8.2 大文件分片上传
java·spring boot·spring
phltxy2 小时前
前缀和算法:从一维到二维,解锁高效区间求和
java·开发语言·算法
码上淘金2 小时前
Prometheus 瘦身指南:小白也能看懂的指标过滤与标签优化
java·算法·prometheus
一轮弯弯的明月2 小时前
竞赛刷题-建造最大岛屿-Java版
java·算法·深度优先·图搜索算法·学习心得
weixin199701080162 小时前
开山网商品详情页前端性能优化实战
java·前端·python
Memory_荒年2 小时前
AQS:Java并发包里的“包租公”,管理着你的锁和通行证!
java·后端
小钻风33662 小时前
Java 8 流式编程
java·开发语言·windows