MVC JsonResult camelCase serialization

Thomas Mondel picture Thomas Mondel · Feb 23, 2013 · Viewed 29.1k times · Source

I am trying to make my action return a JsonResult where all its properties are in camelCase.

I have a simply model:

public class MyModel
{
    public int SomeInteger { get; set; }

    public string SomeString { get; set; }
}

And a simple controller action:

public JsonResult Index()
    {
        MyModel model = new MyModel();
        model.SomeInteger = 1;
        model.SomeString = "SomeString";

        return Json(model, JsonRequestBehavior.AllowGet);
    }

Calling this action method now returns a JsonResult containing the following data:

{"SomeInteger":1,"SomeString":"SomeString"}

For my uses i need the action return the data in camelCase, somehow like this:

{"someInteger":1,"someString":"SomeString"}

Is there any elegant way to do this?

I was looking into possible solutions around here and found MVC3 JSON Serialization: How to control the property names? where they set DataMember definitions to every property of the model, but I do not really want to do this.

Also I found a link where they say that it is possible to solve exactly this kind of issue: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_camelcasing. It says:

To write JSON property names with camel casing, without changing your data model, set the CamelCasePropertyNamesContractResolver on the serializer:

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

One entry on this blog http://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/ also mentiones this solution and states you can simply add it to the RouteConfig.RegisterRoutes to fix this issue. I tried it, but I couldn't make it work.

Do you guys have any idea where I was doing something wrong?

Answer

DanKodi picture DanKodi · Mar 28, 2014

If you want to return a json string from your action which adheres to camelcase notation what you have to do is to create a JsonSerializerSettings instance and pass it as the second parameter of JsonConvert.SerializeObject(a,b) method.

public string GetSerializedCourseVms()
    {
        var courses = new[]
        {
            new CourseVm{Number = "CREA101", Name = "Care of Magical Creatures", Instructor ="Rubeus Hagrid"},
            new CourseVm{Number = "DARK502", Name = "Defence against dark arts", Instructor ="Severus Snape"},
            new CourseVm{Number = "TRAN201", Name = "Transfiguration", Instructor ="Minerva McGonal"}
        };
        var camelCaseFormatter = new JsonSerializerSettings();
        camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
        return JsonConvert.SerializeObject(courses, camelCaseFormatter);
    }