JSON解析
1. 简介
1.1 功能简介
对于「插件」或「发送 API 请求」节点中输出的 JSON 对象,此节点可以通过 JSON Path 表达式将指定内容输出为动态参数(变量、数组),供后续节点使用。
- 可处理的数据: 来自插件节点或发送 API 请求节点返回的 JSON 对象
- 可输出的数据: 变量或数组
2. 使用步骤
2.1 添加 API 请求节点或插件节点
2.2 添加 JSON 解析节点
2.3 获取 JSON 对象
2.4 定义输出参数
可以通过点击「查看解析结果」后复制所需参数的 JSON Path 或者手动输入
2.5 定义错误信息
- 可以通过输出参数中获取返回值作为错误消息,以某个或多个值的条件对比,确定错误。
- 错误的输出消息可以是静态文本,也可以从其他节点中选择动态值。
- 如果定义了错误消息,则可以定义发生错误时,后续节点是否继续执行。
- 继续执行 后面的节点继续执行,如果之后有节点使用本节点对象或输出的数据时,将跳过对应的项(并不一定是整个节点调整,例如更新节点更新了 5 个字段,其中 1 个字段更新时使用了此节点的值,那么只有此字段不处理,其他字段正常更新)
- 中止流程 到此节点结束,后续节点不再执行。
2.6 使用 JSON 解析节点的输出参数
什么是 JSONPath
JSONPath 是参照 XPath 设计的一种对 JSON 格式文档进行解析的工具。通过 JSONPath 表达式,可以方便的从 JSON 结构中获取到任意指定的数据,而无需经过手动层层的解析。工作流中的「JSON 解析」节点,可以对传入的 JSON 数据用 JSONPath 进行解析后输出为参数供后续节点使用。
JSONPath 语法
以下是完事的 JSONPath 语法元素说明
| JSONPath | 描述 |
|---|---|
| $ | 根节点 |
| @ | 当前节点,可以在筛选表达式中使用;也可以用于循环输出数组对象的子节点 |
| .或[] | 取指定子节点 |
| .. | 递归匹配所有子元素 |
| * | 通配符,匹配所有符合条件的节点组成数组 |
| [] | 数组下标,从 0 开始 |
| [,] | 同时选择多个指定节点,可以是节点名称或者数组下标 |
| [start:end] | 获取数组中部分元素 |
| [?()] | 筛选表达式,表达式必须返回一个布尔值用于筛选 |
筛选操作符
JSONPath 中可以使用筛选表达式筛选出符合条件的节点。筛选表达式需要返回一个布尔值,然后 JSONPath 会筛选符合条件的节点组成数组返回。一个典型的筛选表达式是 [?(@.age > 18)] ,其中 @ 代表正在处理的当前节点。更复杂的筛选表达式可以用逻辑运算符 && 和 || 来创建。字符串必须用单引号或双引号括起来,如 [?(@.color == 'blue')] 或 [?(@.color == "blue")] 。 可用的操作符如下表所示:
| 操作 | 描述 |
|---|---|
| == | 等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| > | 大于 |
| >= | 大于等于 |
| =~ | 正则表达式,如:[?(@.name =~ /foo.*?/i)] |
| in | 在...中,如:[?(@.size in ['S', 'M'])] |
| nin | 不在...中 |
| subsetof | 属于...的子集,如:[?(@.sizes subsetof ['S', 'M', 'L'])] |
| anyof | 有交集,如:[?(@.sizes anyof ['M', 'L'])] |
| noneof | 没有交集,如:[?(@.sizes noneof ['M', 'L'])] |
| size | 数组大小或文本长度 |
| empty | 数组或文本为空 |
JSONPath 示例
下面 JSON 代码表示一系列物品(store)信息
- 有 3 本书(book)和一个自行车(bicycle)
- 每本书有类别、作者、书名和价格信息
- 自行车有颜色和价格信息
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
则使用 JSONPath 可以获取如下结果:
| JsonPath | 结果 |
|---|---|
$.store.book[*].author | 所有书的作者 |
$.author | 所有作者 |
$.store.* | 所有物品,包括书和自行车 |
$.store..price | 所有物品的价格 |
..book[2] | 第 3 本书 |
..book[-2] | 倒数第 2 本书 |
..book[0,1] | 前 2 本书 |
..book[:2] | 从第 1 本书(含)到第 3 本书(不含)之间的所有书:前 2 本书 |
..book[1:2] | 从第 2 本书(含)到第 3 本书(不含)之间的所有书:第 2 本书 |
..book[-2:] | 最后 2 本书 |
..book[2:] | 从第 3 本开始所有的书 |
..book[?(@.isbn)] | 所有有 isbn 号的书 |
$.store.book[?(@.price < 10)] | 商店中所有价格小于 10 的书 |
..book[?(@.price <= $['expensive'])] | 商品中所有价格「不贵」的书 |
$..book[?(@.author =~ /.*REES/i)] | 所有符合正则表达式(忽略大小写)的书(这里是取所有姓 REES 的作者的书) |
$..* | 所有物品 |
$.book.length() | 所有书的数量 |