¿Cómo puedo devolver camelCase JSON serializado por JSON.NET desde los métodos de controlador ASP.NET MVC?

Mi problema es que deseo devolver datos JSON camelCased (en lugar de PascalCase) a través de ActionResult desde los métodos de controlador ASP.NET MVC, serializados por JSON.NET .

Como ejemplo, considere la siguiente clase de C #:

public class Person { public string FirstName { get; set; } public string LastName { get; set; } } 

De forma predeterminada, al devolver una instancia de esta clase desde un controlador MVC como JSON, se serializará de la siguiente manera:

 { "FirstName": "Joe", "LastName": "Public" } 

Me gustaría que fuera serializado (por JSON.NET) como:

 { "firstName": "Joe", "lastName": "Public" } 

¿Cómo hago esto?

o, simplemente ponga:

 JsonConvert.SerializeObject( , new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); 

Por ejemplo:

 return new ContentResult { ContentType = "application/json", Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), ContentEncoding = Encoding.UTF8 }; 

Encontré una excelente solución a este problema en el blog de Mats Karlsson. La solución es escribir una subclase de ActionResult que serialice los datos a través de JSON.NET, configurando este último para que siga la convención de camelCase:

 public class JsonCamelCaseResult : ActionResult { public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior) { Data = data; JsonRequestBehavior = jsonRequestBehavior; } public Encoding ContentEncoding { get; set; } public string ContentType { get; set; } public object Data { get; set; } public JsonRequestBehavior JsonRequestBehavior { get; set; } public override void ExecuteResult(ControllerContext context) { if (context == null) { throw new ArgumentNullException("context"); } if (JsonRequestBehavior == JsonRequestBehavior.DenyGet && String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet."); } var response = context.HttpContext.Response; response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json"; if (ContentEncoding != null) { response.ContentEncoding = ContentEncoding; } if (Data == null) return; var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings)); } } 

Luego use esta clase de la siguiente manera en su método de controlador MVC:

 public ActionResult GetPerson() { return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)}; } 

Para WebAPI , consulte este enlace: http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

Básicamente, agregue este código a su Application_Start :

 var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

Creo que esta es la respuesta simple que estás buscando. Es del blog de Shawn Wildermuth :

 // Add MVC services to the services container. services.AddMvc() .AddJsonOptions(opts => { opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); 

Una alternativa al filtro personalizado es crear un método de extensión para serializar cualquier objeto a JSON.

 public static class ObjectExtensions { /// Serializes the object to a JSON string. /// A JSON string representation of the object. public static string ToJson(this object value) { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { new StringEnumConverter() } }; return JsonConvert.SerializeObject(value, settings); } } 

Luego llámelo cuando regrese de la acción del controlador.

 return Content(person.ToJson(), "application/json"); 

En ASP.NET Core MVC.

  public IActionResult Foo() { var data = GetData(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); return Json(data, settings); } 

A continuación se muestra un método de acción que devuelve una cadena json (cameCase) serializando una matriz de objetos.

 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); } 

Tenga en cuenta que la instancia JsonSerializerSettings pasó como el segundo parámetro. Eso es lo que hace que el camelCase suceda.