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

ASP.NET Core接口反序列化请求Body的JSON对象报错及多参数绑定问题咨询

问题解决方案

报错原因

  • 你调用JsonSerializer.Deserialize时传入的requestBody是object类型,该方法不支持直接传入object作为反序列化源:你用[FromBody] object接收请求体时,ASP.NET Core已经默认将原始JSON反序列化为JsonElement(System.Text.Json下)类型的对象,不是原始JSON字节流/字符串,所以触发类型不匹配报错。
  • 你之前直接用[FromBody] ParamModel requestBody得到null的原因是:你的入参JSON是平级任意键值对结构,和ParamModel的PName、PValue属性结构不匹配,模型绑定自然无法赋值。

实现思路评估

你打算定义ParamList作为入参的思路可行,但不符合你当前期望的前端传参结构:如果用ParamList接收,前端需要传入包含data数组的嵌套结构,而不是你现在要的平级键值对结构。

具体解决方案

方案1:保持现有前端传参结构(推荐,无需调整前端逻辑)

直接用Dictionary<string, string>接收请求体,再手动转换为List<ParamModel>,代码示例如下:

[HttpPost("postWithBody")]
public async Task<IActionResult> PostWithBody (string param1, [FromBody] Dictionary<string, string> requestBody)
{
    // 直接将字典键值对转换为ParamModel集合
    List<ParamModel> paramModels = requestBody.Select(kv => new ParamModel
    {
        PName = kv.Key,
        PValue = kv.Value
    }).ToList();

    // 后续自行处理paramModels即可
    return Ok(param1);
}

方案2:调整前端传参结构,使用你定义的ParamList

如果接受修改前端传参格式,你的思路可以直接落地,前端需要传入的JSON结构调整为:

{
    "data": [
        {"PName": "Param1", "PValue": "XXX"},
        {"PName": "Param2", "PValue": "111"}
    ]
}

接口代码直接声明[FromBody] ParamList requestBody即可,无需额外反序列化操作,框架会自动完成模型绑定。

补充注意点

如果出现属性名大小写不匹配导致绑定失败的问题,可在项目启动配置中添加System.Text.Json的忽略大小写配置:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:24:06