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
相关产品推荐
相关产品推荐

