| 语法元素 | 描述 | 示例 | 
|---|
| $ | 根节点标识符 | $.a | 
| @ | 当前节点标识符(仅在过滤选择器中有效) | @.a | 
| [<selectors>] | 子段:选择节点的零个或多个子节点 | $['a'],@[a] | 
| .name | 简写 ['name'] | $.a,@.a | 
| .* | 简写 [*] | $.*,@.* | 
| ..[<selectors>] | 后代段:选择节点的零个或多个后代 | $..a,@..a | 
| ..name | 简写 ..['name'] | $..a,@..a | 
| ..* | 简写 ..[*] | $..*,@..* | 
| 'name' | 名称选择器:选择对象的命名子对象 | $['a'],@[a] | 
| * | 通配符选择器:选择节点的所有子节点 | $[*],@[*] | 
| 3 | 索引选择器:选择数组的索引子项(从 0 开始) | $[3],@[3] | 
| 0:100:5 | 数组切片选择器:数组的 start:end:step | $[0:100:5],@[0:100:5] | 
| ?<logical-expr> | 过滤选择器:使用逻辑表达式选择特定的子项 | $[?@.a == 1] | 
| fun(@.foo) | 过滤函数:在过滤表达式中调用函数(IETF 标准) | $[?count(@.a) > 5] | 
| .fun() | 聚合函数:作选择器用(jayway 风格) | $.list.min() | 
过滤函数、聚合函数,统称为:扩展函数。
2、过滤选择器语法参考
| 语法 | 描述 | 优先级 | 示例 | 
|---|
| (...) | 分组 | 5 | $[?(@.a > 1) && (@.b < 2)] | 
| fun(...) | 函数扩展 | 5 | $[?count(@.a) > 5] | 
| ! | 逻辑 非 | 4 | $[?!(@.a > 1)] | 
| ==,!=,<,<=,>,>= | 关系操作符 | 3 | $[?(@.a == 1)] | 
| && | 逻辑 与 | 2 | $[?(@.a > 1) && (@.b < 2)] | 
| || | 逻辑 或 | 1 | $[?(@.a > 1) || (@.b < 2)] | 
3、操作符参考(支持外部扩展定制)
过滤器是用于过滤数组的逻辑表达式。一个典型的过滤器是[?(@。Age > 18)]其中@表示当前正在处理的项目。更复杂的过滤器可以使用逻辑操作符&&和||创建。字符串字面量必须用单引号或双引号括起来([?(@.color == 'blue')] or [?(@.color == "blue")])。
- 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)] | 
| 操作符 | 描述 | 示例 | 
|---|
| startsWith | 左(字符串)开头匹配右 | [?(@.s startsWith 'a')] | 
| endsWith | 左(字符串)结尾匹配右 | [?(@.s endsWith 'b')] | 
| contains | 左(数组或字符串)包含匹配右 | [?(@.s contains 'c')] | 
4、扩展函数参考(支持外部扩展定制)
以下函数,可同时用于 “过滤器” 或 “查询器”。示例:$[?length(@) > 1](作为过滤函数) 或 $.length() (作为选择器)
- IETF JSONPath (RFC 9535) 标准定义函数(支持)
| 函数 | 描述 | 参数类型 | 结果类型 | 
|---|
| length(x) | 字符串、数组或对象的长度 | 值 | 数值 | 
| count(x) | 节点列表的大小 | 节点列表 | 数值 | 
| match(x,y) | 正则表达式完全匹配 | 值,值 | 逻辑值 | 
| search(x,y) | 正则表达式子字符串匹配 | 值,值 | 逻辑值 | 
| value(x) | 节点列表中单个节点的值 | 节点列表 | 值 | 
函数可以在路径的末尾调用——函数的输入是路径表达式的输出。函数的输出由函数本身决定。
| 函数 | 描述 | 输出类型 | 
|---|
| 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可以是负数(从末尾开始计算) | 依赖于数组元素类型 | 
5、可选特性参考
| 特性 | 描述 | 
|---|
| Feature.JsonPath_IETF_RFC_9535 | IETF_RFC_9535 标准模式 | 
| Feature.JsonPath_JaywayMode | Jayway 兼容模式 | 
| Feature.JsonPath_AlwaysReturnList | 无论路径是否明确,总是返回一个 List | 
| Feature.JsonPath_AsPathList | 作为路径列表 | 
| Feature.JsonPath_SuppressExceptions | 抑制异常(异常时返回 null) | 
//输出一个 jsonpath 列表:["$['a']['b']","[$['a']['c']]"]
ONode.ofJson(json, Feature.JsonPath_AsPathList).select("$..*").toJson();