### 1、JSONPath 语法参考（[IETF JSONPath (RFC 9535)](https://www.rfc-editor.org/rfc/rfc9535.html)）


| 语法元素              | 描述                                                           | 示例                           |
|---------------|------------------------------------|-------------------|
| `$`                     | 根节点标识符                                                | `$.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)]`                 |  


* snack-jsonpath 增量操作符（支持）


| 操作符        | 描述                 | 示例                                      |   
|------------|--------------------|-----------------------------------------|
| `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)`           | 节点列表中单个节点的值          |  节点列表          |  值  |


* 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可以是负数（从末尾开始计算） | 依赖于数组元素类型  |



* （开放式）支持外部扩展定制


### 5、可选特性参考



| 特性                          | 描述                         | 
| ----------------- | ----------------- |
| `Feature.JsonPath_IETF_RFC_9535`     | IETF_RFC_9535 标准模式     | 
| `Feature.JsonPath_JaywayMode`         | Jayway 兼容模式     | 
| `Feature.JsonPath_AlwaysReturnList`     | 无论路径是否明确，总是返回一个 List     | 
| `Feature.JsonPath_AsPathList`               | 作为路径列表     | 
| `Feature.JsonPath_SuppressExceptions`     | 抑制异常（异常时返回 null）     | 


```java
//输出一个 jsonpath 列表：["$['a']['b']","[$['a']['c']]"]
ONode.ofJson(json, Feature.JsonPath_AsPathList).select("$..*").toJson();
```




