.NET Core 3.1 POST请求中JsonProperty标记属性模型绑定失效问题
问题产生原因
这个问题本质是模型绑定流程没有按预期走Newtonsoft.Json的反序列化逻辑,常见触发原因有以下几类:
- 绑定源未正确指定,未走JSON反序列化流程
.NET Core 3.1的MVC模型绑定会根据规则选择值来源:只有给参数显式标记[FromBody],或者控制器加了[ApiController]特性时,复杂类型参数才会从请求Body读取内容、调用JSON格式化器做反序列化。如果不满足这个条件,框架会默认尝试从表单、查询字符串、路由数据中匹配属性名绑定值,这个流程完全不经过JSON序列化器,只会按C#属性的原名LalaId匹配,自然识别不了[JsonProperty]配置的id别名。 - AddNewtonsoftJson配置未实际生效,反序列化仍走System.Text.Json
.NET Core 3.1默认的System.Text.Json不识别Newtonsoft.Json的[JsonProperty]特性,出现这个情况通常是以下子问题导致:- 未安装对应版本的依赖包:.NET Core 3.1没有内置Newtonsoft.Json的MVC集成支持,必须单独安装和.NET Core 3.1大版本匹配的
Microsoft.AspNetCore.Mvc.NewtonsoftJsonNuget包,否则.AddNewtonsoftJson()的配置不会生效,框架仍用System.Text.Json做反序列化。 - 配置顺序错误:如果在调用
.AddNewtonsoftJson()之后,又调用了修改MVC输入格式化器集合的配置(比如重复注册MVC服务、修改InputFormatter列表),可能把Newtonsoft的JSON格式化器覆盖移除,回退到System.Text.Json实现。 - 自定义契约解析器逻辑异常:你配置的
CustomJsonContractResolver如果重写了属性名映射逻辑,没有正确读取[JsonProperty]特性配置的别名,也会导致字段映射规则失效。
- 未安装对应版本的依赖包:.NET Core 3.1没有内置Newtonsoft.Json的MVC集成支持,必须单独安装和.NET Core 3.1大版本匹配的
快速排查步骤
- 给接口参数显式添加
[FromBody]特性,给控制器类添加[ApiController]特性,强制从请求Body绑定值:
[ApiController] public class TestController : ControllerBase { [HttpPost] public async Task<IActionResult> Lala([FromBody]DeleteMe requestPayload) { // do stuff } }
- 检查项目Nuget引用,确认已安装3.1.x版本的
Microsoft.AspNetCore.Mvc.NewtonsoftJson包,版本号和你项目使用的.NET Core 3.1 SDK版本保持一致。 - 如果前两步做完仍不生效,临时注释掉
CustomJsonContractResolver的注册,用Newtonsoft默认的契约解析器测试,排查是否是自定义解析器的逻辑覆盖了[JsonProperty]的配置。
如果你不想排查Newtonsoft配置问题,也可以直接给属性加System.Text.Json自带的
[JsonPropertyName("id")]特性,同样能实现字段名id和属性的映射,不需要依赖Newtonsoft的特性。
内容的提问来源于stack exchange,提问作者Michael Tontchev
相关产品推荐
相关产品推荐

