如何在Amazon States Language中用JSONata合并Lambda返回与状态输入?
AWS Step Function Lambda任务:输入输出合并与字段覆盖实现
要实现调用Lambda后,将返回的sensed-colour转换为根级colour并覆盖原字段,同时保留输入的所有其他内容,你可以利用ASL的ResultSelector结合JSONata的$merge函数来完成,具体实现如下:
完整ASL状态定义
{ "Comment": "调用Lambda并合并输入输出,覆盖colour字段", "StartAt": "ProcessColour", "States": { "ProcessColour": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:YourColourSensorLambda", "ResultSelector": { "$merge": [ "$$", { "colour": "$['sensed-colour']" } ] }, "ResultPath": "$", "End": true } } }
关键逻辑解释
$$:在Task状态的JSONata表达式中,代表传入该Task的原始输入数据,会完整保留所有原有字段(比如示例中的id、metadata等)$:代表Lambda函数的返回结果,这里从中提取sensed-colour字段,映射为根级的colour$merge:JSONata的合并函数,会将第二个对象中的字段覆盖第一个对象的同名字段,同时保留第一个对象的其他所有内容,完美满足"合并+覆盖"的需求
示例验证
输入数据
{ "id": "sensor-001", "colour": "initial-blue", "metadata": { "timestamp": "2024-05-20T10:00:00Z" } }
Lambda返回结果
{ "sensed-colour": "detected-red" }
最终输出
{ "id": "sensor-001", "colour": "detected-red", "metadata": { "timestamp": "2024-05-20T10:00:00Z" } }
常见问题规避
- 若之前用单纯JSONPath方案得到嵌套结构,通常是因为错误使用了
ResultPath将Lambda结果存入子字段(比如$.lambdaOutput),而没有直接合并到根级 - 若JSONata方案仅保留转换后的字段,是因为没有使用
$merge结合原始输入($$),仅返回了转换后的单个字段对象
内容的提问来源于stack exchange,提问作者Sean B. Durkin
相关产品推荐
相关产品推荐

