I'd like to have JSON 'properly' serialized (camelCase), and the ability to change date formats if necessary.
For Web API it is very easy – in the Global.asax I execute the following code
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
This code, at the pipeline level, handles serialization the way I'd like.
I would like to accomplish the same thing in MVC 4 – have any JSON returned from controller action methods to be serialized properly. With a little searching I found the following code to throw in the Global.asax application startup:
HttpConfiguration config = GlobalConfiguration.Configuration;
Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter);
config.Formatters[index] = new JsonMediaTypeFormatter
{
SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }
};
It seems to execute fine but when I return JSON from a controller it is all PascalCased. A simple example of my action method:
private JsonResult GetJsonTest()
{
var returnData = dataLayer.GetSomeObject();
return Json(returnData, JsonRequestBehavior.AllowGet);
}
Am I going about this wrong? Any idea how to accomplish this at the pipeline level?
Best Answer
I would recommend using something like ServiceStack or Json.NET for handling Json output in your MVC application. However, you can easily write a class and override the Json method using a base class. See my example below.
NOTE: With this, you do not need anything in your Global.ascx.cs file.
Custom JsonDotNetResult class:
Base Controller class:
Now, on your controller action you can simply return something like so.
BAM. You now have camelcase Objects returned with Json :)
NOTE: There are ways to do this with Serializer settings on each object that you make with Json. But who would want to type that out every time you want to return Json?