为什么AWS Step Functions会对Lambda返回的JSON输出做转义?
问题根因
Lambda与Step Function交互存在默认序列化规则,出现该问题的核心原因是你在Lambda代码中返回的是JSON序列化后的字符串,而非对应语言的原生对象类型:
- Lambda运行时默认会将返回值做一次JSON序列化再传递给Step Function
- 本地调试时你直接查看函数返回的字符串,没有经过后续二次序列化处理,因此看起来JSON结构合法
- Step Function接收到字符串类型的返回值后,会按照JSON规则对字符串做二次序列化:自动在字符串首尾添加双引号,内部的双引号统一转义为
\",最终就得到了你看到的异常格式。
解决方法
方法1:Lambda侧直接返回原生对象(推荐)
不要在Lambda代码里手动对结果做JSON序列化,直接返回对应语言的原生对象即可,Step Function会自动完成序列化处理,不会出现二次转义问题:
- Python代码示例:不要返回
json.dumps({"test":60,"test2":"30000","test3":"result1"}),直接返回{"test":60,"test2":"30000","test3":"result1"} - Node.js代码示例:不要返回
JSON.stringify({test:60,test2:"30000",test3:"result1"}),直接返回{test:60,test2:"30000",test3:"result1"}
方法2:Step Function侧做反序列化(适用于无法修改Lambda代码的场景)
如果Lambda代码无法调整,可以在后续步骤的参数处理中使用States.StringToJson内置函数对转义后的字符串做反序列化,示例配置如下:
"NextStep": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "你的下游函数ARN", "Payload.$": "States.StringToJson($.上一步Lambda返回值对应的字段名)" } }
处理后下游步骤就能拿到正常的JSON结构。
内容的提问来源于stack exchange,提问作者PloniStacker
相关产品推荐
相关产品推荐

