You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:13:08