跳到主要内容

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()所有书的数量