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

如何在Step Function中合并并行状态的JSON输出为单一对象

解决方案:合并Step Functions并行块的输出结果

我之前也碰到过一模一样的需求,其实Step Functions有几种简单直接的方式能实现这个合并,你可以根据自己的场景选最合适的:

方法1:用Pass状态直接提取指定字段

如果你的并行分支职责很明确(比如populateA只负责填充a,populateB只负责填充b),最直接的方式是在并行块之后加一个Pass状态,通过JSON Path精准提取每个分支的有效值:

"MergeResults": {
  "Type": "Pass",
  "Parameters": {
    "a.$": "$[0].a",
    "b.$": "$[1].b"
  },
  "ResultPath": "$",
  "Next": "YourNextState"
}

这里$[0]对应并行块第一个分支(populateA)的输出,$[1]对应第二个分支(populateB)的输出,直接把需要的字段提取出来组合成你要的目标对象。

方法2:用内置函数States.JsonMerge灵活合并

如果你的场景更灵活(比如分支数量可能变化,或者字段填充规则不确定),可以用Step Functions的内置函数States.JsonMerge来合并两个JSON对象,自动忽略null值的覆盖:

在Pass状态里这么配置:

"MergeResults": {
  "Type": "Pass",
  // 直接返回合并后的完整对象
  "Result.$": "States.JsonMerge($[0], $[1], false)",
  "ResultPath": "$",
  "Next": "YourNextState"
}

第三个参数false表示不覆盖已有非null的字段,刚好匹配你的场景:populateA的b是null,不会覆盖populateB的b值;populateB的a是null,也不会覆盖populateA的a值,最终就能得到{"a":"A", "b":"B"}。

方法3:在并行块内直接处理(ResultSelector)

你也可以不用额外的Pass状态,直接在并行块的定义里通过ResultSelector处理输出:

"YourParallelBlock": {
  "Type": "Parallel",
  "Branches": [
    {
      "StartAt": "populateA",
      "States": {
        "populateA": {
          /* 你的populateA状态定义 */
        }
      }
    },
    {
      "StartAt": "populateB",
      "States": {
        "populateB": {
          /* 你的populateB状态定义 */
        }
      }
    }
  ],
  "ResultSelector": {
    "a.$": "$[0].a",
    "b.$": "$[1].b"
  },
  "ResultPath": "$",
  "Next": "YourNextState"
}

这样并行块执行完成后,直接输出合并好的对象,省去了额外的状态步骤。


内容的提问来源于stack exchange,提问作者Tuhin Sah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:36:39