¶ 为节点动态装配数据
此篇文档介绍数据装配中会使用到的表达式,当要对数据进行一些简单处理时,这些开箱即用的表达式往往非常有用。
Authing 流程编排引擎使用开源的 jsonpath (opens new window) 作为装配数据的解析引擎,如果你对此 library 非常熟悉,可以直接查询其文档。
¶ 创建示例 workflow
如果你刚刚接触 Authing 的身份自动化,推荐阅读 [编写第一个 Workflow](/workflow/快速开始/Boolean/编写第一个 Workflow.html) 。
这里我们使用一份 Mock 数据:
{
    "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
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
在此我们创建一个简单的 workflow:使用 JSON 节点拉取数据,再使用数据合成节点测试数据装配的使用:
1)拉取一个传入 JSON 数据节点并且编辑此节点

2)使用 JSON 节点拉取数据,然后使用上面的 JSON 数据填入参数配置中,然后点击保存

3)先点击 测试执行中的确定执行,让 workflow 先执行

4)接下来我们就可以在数据合成节点看到 HTTP 节点的执行结果,并可以对其数据进行装配了。



执行 workflow,你就可以看到数据合成节点的输出,即我们测试的装配结果:比如最简单的场景,就是直接对值的引用。下面会介绍其他更高级的数据装配表达式。
¶ 常见解析表达式
| 表达式 | 示例 | 含义 | 
|---|---|---|
| ${某个节点.output.xxx} | ${传入 JSON 数据.output.data} | 最常见方式,直接应用值 | 
| ${某个节点.output.a[*].b} | ${传入 JSON 数据.output.data[*].author} | 提取列表 a 的所有元素的 b 字段,转换成数组 | 
| ${某个节点.output.a..b} | ${传入 JSON 数据.output.data..author} | 提取 a 对象下所有元素的 b 字段,转换成数组 | 
| ${某个节点.output.a[index]} | - ${传入 JSON 数据.output.data.store.book[0]} (第一个元素) - ${传入 JSON 数据.output.data.store.book[1]} (第二个元素) - ${传入 JSON 数据.output.data.store.book[-1]} (倒数第一个元素) - ${传入 JSON 数据.output.data.store.book[-2]} (倒数第二个元素) | 获取数组某个下标的元素(下标从 0 开始) | 
| ${某个节点.output.a[index1,index2,index3]} 注意逗号之间不要有空格! | - ${传入 JSON 数据.output.data.store.book[0,3,5]} (第一、第四和第六个元素) | 批量获取数组某些下标的元素(下标从 0 开始) | 
| ${某个节点.output.a[fromIndex:toIndex]} 注意「:」之间不要有空格! | - ${传入 JSON 数据.output.data.store.book[0:3]} (从第一个到第三个元素,不包含最后一个下标) - ${传入 JSON 数据.output.data.store.book[:3]} (从第一个到第三个元素,不包含最后一个下标) - ${传入 JSON 数据.output.data.store.book[2:]} (从第三个元素到最后一个元素) - ${传入 JSON 数据.output.data.store.book[-2:]} (最后两个元素) | 获取数组从开始下标到介绍下标的所有元素,不包含 toIndex 下标的值 | 
| ${某个节点.output.a[?(@.b.c)]} | - ${传入 JSON 数据.output.data.store.book[?(@.isbn)]} | 过滤数组数据中某个字段(支持嵌套)存在的元素 | 
| ${某个节点.output.a[?(@.b.c<=10)]} | - ${传入 JSON 数据.output.data.store.book[?(@.price<10)]} 所有 price 小于 10 的书 - ${传入 JSON 数据.output.data.store.book[?(@.price<=10)]} 所有 price 小于等于 10 的元素 - ${传入 JSON 数据.output.data.store.book[?(@.price>=10)]} 所有 price 大于等于 10 的元素 | 根据一定条件过滤数组中的数据 | 
| ${某个节点.output.a[?(@.b.c<=$['c']['d'])]} | - ${传入 JSON 数据.output.data.store.book[?(@.price<$['expensive'])]} 所有 price 小于 |