newtonsoft net camelcase asp.net-mvc json json.net camelcasing

asp.net-mvc - newtonsoft - json net camelcase



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

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?


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.


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


En ASP.NET Core MVC.

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


Encontré una excelente solución a este problema en el blog 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)}; }



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

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

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

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


o, simplemente ponga:

JsonConvert.SerializeObject( <YOUR OBJECT>, 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 };