.NET 4.5.2 MVC接收含下划线JSON属性时部分字段值为null
问题分析与解决方案
咱们一步步来排查你遇到的JSON模型绑定部分字段为null的问题:
1. 先修复JSON请求的语法错误
你提供的JSON开头多了一个左大括号{{,这是无效的JSON格式,序列化器解析时会直接出错,这大概率是导致部分字段绑定失败的直接原因。修正后的正确JSON应该是:
{ "channel": "/api/v5", "action": "added", "resource_id": "d5276373-a975-43d5-a361-6947b20bb666", "app_user_auth": { "access_token": "78505b15-3c46-4287-8658-f52238b94724", "token_type": "Bearer", "expires_in": 300, "user_id": "7e575bd7-3a4a-46bd-b449-c99d919de8534", "organization_id": "a5f832fa-6226-4a6f-a7ff-b75758fd57ed" } }
2. 检查控制器特性混用问题
你在控制器上同时用了System.Web.Mvc.Route(MVC路由特性)和System.Web.Http.HttpPost(Web API特性),这会导致绑定逻辑混乱:
- 如果这是Web API控制器,请确保你的控制器继承自
System.Web.Http.ApiController,而不是普通的System.Web.Mvc.Controller,并且替换成System.Web.Http.Route特性来定义路由。 - 如果这是MVC控制器,
[FromBody]在MVC中的绑定逻辑和Web API不一样,MVC默认不会自动识别Newtonsoft的[JsonProperty]特性,需要额外配置。
3. 确保Newtonsoft.Json被正确配置为序列化器
你已经在模型类上用了Newtonsoft的[JsonProperty]特性,但得确保项目配置了用它来做JSON序列化:
针对Web API项目:
在Global.asax的Application_Start方法里添加配置:
GlobalConfiguration.Configure(config => { // 保证JSON格式化器使用Newtonsoft.Json,让你的JsonProperty特性生效 config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); });
针对MVC项目:
如果是MVC控制器,需要替换默认模型绑定器为Newtonsoft的实现,或者在Global.asax里配置:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // 配置MVC使用Newtonsoft.Json处理模型绑定 var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings(); jsonSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver(); ModelBinders.Binders.Add(typeof(Request), new NewtonsoftJsonModelBinder(jsonSettings)); }
(注:NewtonsoftJsonModelBinder需要你自行实现,或者使用第三方提供的绑定器,也可以通过配置MVC视图引擎来全局启用Newtonsoft序列化)
4. 小细节:检查字段值的合法性
注意到user_id的值"7e575bd7-3a4a-46bd-b449-c99d919de8534"比标准GUID多了一位(标准是36字符,这个是37位),虽然你的UserId是string类型不会直接报错,但如果后续要转成Guid类型会出问题,建议确认这个值的正确性。
先修复JSON语法错误,再调整控制器配置,应该就能解决部分字段为null的问题了。
内容的提问来源于stack exchange,提问作者Joel Wiklund
相关产品推荐
相关产品推荐

