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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:30