如何让AWS Step Functions中的嵌套JSONata表达式正确解析?
AWS Step Functions 强制解析嵌套JSONata表达式问题解决方案
问题分析
在Step Functions中,JSONata表达式({% ... %}语法)仅在状态的Parameters、ResultSelector、OutputPath等官方支持JSONata的配置字段中会被自动解析。如果直接将表达式写在输入的字符串值里,系统会将其视为普通文本,不会执行解析逻辑,这就是你遇到的表达式未被替换的核心原因。
解决方案
1. 利用ResultSelector直接构造解析后的对象
如果你的目标是生成包含动态引用的输出对象,直接在状态的ResultSelector中定义字段,这里的JSONata表达式会被自动解析。示例Pass状态配置:
{ "Type": "Pass", "ResultSelector": { "value1": "$.value1", "value2": "$.value1" }, "End": true }
当输入为{"value1": "something"}时,输出会直接得到:
{"value1": "something", "value2": "something"}
注:这里可以用
$.value1或$states.input.value1两种写法,效果一致。
2. 通过Lambda函数处理嵌套表达式的二次解析
如果输入中已经包含{% ... %}格式的嵌套表达式,Step Functions本身不支持自动二次解析,此时可以借助Lambda函数手动解析:
- 编写Lambda函数(以Node.js为例),使用JSONata库解析字符串中的表达式:
const jsonata = require('jsonata'); exports.handler = async (event) => { const parseNestedExpressions = (obj) => { for (const key in obj) { if (typeof obj[key] === 'string') { const exprMatch = obj[key].match(/^\{%\s*(.+)\s*%\}$/); if (exprMatch) { const expression = exprMatch[1]; obj[key] = jsonata(expression).evaluate(event); } } else if (typeof obj[key] === 'object' && obj[key] !== null) { parseNestedExpressions(obj[key]); } } return obj; }; return parseNestedExpressions({ ...event }); };
- 在Step Functions中添加Lambda调用状态,将原始输入传递给该函数,函数返回的结果即为解析后的对象。
3. 用States.Format拼接动态字符串(适用于表达式为字符串一部分的场景)
如果value2需要将动态值作为字符串的一部分,使用States.Format函数:
{ "Type": "Pass", "ResultSelector": { "value1": "$.value1", "value2": "States.Format('动态值:{}', $.value1)" }, "End": true }
输出会是:{"value1": "something", "value2": "动态值:something"}
内容的提问来源于stack exchange,提问作者Vito Raykov
相关产品推荐
相关产品推荐

