Step Function传JSON至AWS Lambda遇JsonReaderException错误排查
问题分析与解决方案
这个问题的核心原因是Lambda函数的输入参数类型和Step Function传递的输入格式不匹配,导致JSON序列化/反序列化过程出错,具体拆解如下:
为什么单独测试正常,Step Function调用失败?
- 单独测试时,你传入的是转义后的JSON字符串(
"{ \"id\": \"1\", \"OddOrEvenPostsResult\": 2}"),此时Lambda的默认序列化器会把这个值直接解析为string类型的参数,JObject.Parse(input)自然能正常把字符串转成JSON对象。 - 但Step Function传递的是原生JSON对象(
{ "id": "1", "OddOrEvenPostsResult": 2 }),Lambda的JsonSerializer会尝试把整个JSON对象反序列化为string类型——这就触发了JsonReaderException,因为它预期的是一个引号包裹的字符串,却直接遇到了{字符。
解决办法(推荐按优先级选择)
方案1:使用强类型输入(最推荐)
抛弃手动解析JSON字符串的方式,定义一个和输入结构匹配的.NET类,让Lambda的序列化器自动完成反序列化,既安全又简洁:
using System; using Amazon.Lambda.Core; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] namespace AWSLambda1 { // 定义和输入结构对应的模型类 public class PostInput { public string Id { get; set; } public int OddOrEvenPostsResult { get; set; } } public class Function { // 参数直接用强类型对象 public void PostsBasedOnOddOrEven(PostInput input, ILambdaContext context) { var postId = int.Parse(input.Id); var oddOrEvenResult = input.OddOrEvenPostsResult; // 你的业务逻辑代码 } } }
修改后,Step Function传递的原生JSON对象会被自动映射到PostInput实例,无需手动调用JObject.Parse,彻底避免解析错误。
方案2:修改Step Function输入为字符串格式
如果你坚持要保留string类型的参数,需要让Step Function把JSON对象转换为转义后的字符串格式。可以在Step Function的Lambda调用任务中,使用States.Format函数来序列化输入:
"YourLambdaTask": { "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:YOUR_LAMBDA_FUNCTION", "Parameters": { "input.$": "States.Format('{}', $)" }, "End": true }
States.Format('{}', $)会把当前的JSON输入对象序列化为字符串,传递给Lambda的input参数,这样JObject.Parse(input)就能正常工作了。
方案3:手动读取原始输入流(不推荐)
如果以上方案都不适用,你可以修改Lambda函数的参数为Stream,手动读取并解析输入:
public void PostsBasedOnOddOrEven(Stream inputStream, ILambdaContext context) { using var reader = new StreamReader(inputStream); var input = reader.ReadToEnd(); var details = JObject.Parse(input); var postId = (int)details["id"]; var oddOrEvenResult = (int)details["OddOrEvenPostsResult"]; }
这种方式绕开了Lambda的默认序列化器,但代码复杂度更高,不推荐作为常规方案。
内容的提问来源于stack exchange,提问作者Ajit Goel
相关产品推荐
相关产品推荐

