snack4-jsonpath v4.0.36支持IETF RFC 9535标准,发布了吗?
摘要:高性能Json path查询(比 jayway.jsonpath 快很多倍)。同时兼容 jayway.jsonpath 和 IETF JSONPath (RFC 9535) 标准 (用 options 切换)。为下一个十年提供强劲的 Jso
提供 Json Dom 的构建、编码解转换(序列化)、获取、JsonPath 查询、JsonSchema 验证等功能。
<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.jsonpath 和 IETF 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 校验支持
开源项目仓库地址:
https://gitee.com/noear/snackjson
https://github.com/noear/snackjson
文档资料:
https://solon.noear.org/article/snack
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
||
逻辑 或
1
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可以是负数(从末尾开始计算)
依赖于数组元素类型
