正确的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());
我在这里写了一个小博客。