正确的JSON序列化在MVC 4

我想有正确的JSON序列化(camelCase),并能够在必要时更改date格式。

对于Web API来说,这非常简单 – 在Global.asax中我执行下面的代码

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

这个代码,在pipe道级别,按我喜欢的方式处理序列化。

我想在MVC 4中完成同样的事情 – 从控制器操作方法返回的任何JSON被正确序列化。 有一点search,我发现下面的代码抛出Global.asax应用程序启动:

 HttpConfiguration config = GlobalConfiguration.Configuration; Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter); config.Formatters[index] = new JsonMediaTypeFormatter { SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; 

它似乎执行得很好,但是当我从控制器返回JSON时,它全部是PascalCased。 我的行动方法的一个简单的例子:

 private JsonResult GetJsonTest() { var returnData = dataLayer.GetSomeObject(); return Json(returnData, JsonRequestBehavior.AllowGet); } 

我是否在谈论这个错误? 任何想法如何在pipe道级完成这一点?

我会build议使用像ServiceStack或Json.NET的东西在您的MVC应用程序中处理Json输出。 但是,您可以轻松编写一个类并使用基类重写Json方法。 看我下面的例子。

注意:有了这个,你不需要在你的Global.ascx.cs文件中有任何东西。

自定义JsonDotNetResult类:

 public class JsonDotNetResult : JsonResult { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List<JsonConverter> { new StringEnumConverter() } }; public override void ExecuteResult(ControllerContext context) { if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("GET request not allowed"); } var response = context.HttpContext.Response; response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json"; if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; } if (this.Data == null) { return; } response.Write(JsonConvert.SerializeObject(this.Data, Settings)); } } 

基础控制器类:

 public abstract class Controller : System.Web.Mvc.Controller { protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonDotNetResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior }; } } 

现在,在你的控制器动作,你可以简单地返回类似的东西。

 return Json(myObject, JsonRequestBehavior.AllowGet); 

BAM。 你现在有camel对象与Json返回:)

注意:在使用Json创build的每个对象上,都可以使用Serializer设置来执行此操作。 但是每当你想要返回Json的时候,谁会想输出这个呢?

虽然Web API使用JSON.NET,但MVC4默认使用JavaScriptSerializer,我不认为它支持更改为Camel Case序列化。 选中此项: 在ASP.NET MVC中设置默认JSON序列化程序

我的build议是,你创build一个自定义的JsonNetResult这里描述使用JSON.NET作为ASP.NET MVC 3默认的JSON序列化程序 – 这有可能吗? 并将最后一行更改为:

 var serializedObject = JsonConvert.SerializeObject( Data, Formatting.Indented, , new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() }); 
 Note that below information is for Asp .Net core 

.Net团队最近宣布,MVC现在默认序列化JSON与驼峰案例名称。

用下面的几行你将能够启用这个function:

 services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); 

我在这里写了一个小博客。