Mon problème est que je souhaite retourner les données JSON camelCased (par opposition à PascalCase standard) via ActionResult à partir des méthodes de contrôleur ASP.NET MVC, sérialisées par JSON.NET .
À titre d’exemple, considérons la classe C # suivante:
public class Person { public ssortingng FirstName { get; set; } public ssortingng LastName { get; set; } }
Par défaut, lors du renvoi d’une instance de cette classe à partir d’un contrôleur MVC en tant que JSON, elle sera sérialisée de la manière suivante:
{ "FirstName": "Joe", "LastName": "Public" }
Je voudrais qu’il soit sérialisé (par JSON.NET) comme:
{ "firstName": "Joe", "lastName": "Public" }
Comment puis-je faire cela?
ou simplement mettre:
JsonConvert.SerializeObject( , new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
Par exemple:
return new ContentResult { ContentType = "application/json", Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }), ContentEncoding = Encoding.UTF8 };
J’ai trouvé une excellente solution à ce problème sur le blog de Mats Karlsson. La solution consiste à écrire une sous-classe d’ActionResult qui sérialise les données via JSON.NET, en configurant cette dernière pour qu’elle respecte la convention camelCase:
public class JsonCamelCaseResult : ActionResult { public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior) { Data = data; JsonRequestBehavior = jsonRequestBehavior; } public Encoding ContentEncoding { get; set; } public ssortingng 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 && Ssortingng.Equals(context.HttpContext.Request.HttpMethod, "GET", SsortingngComparison.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 = !Ssortingng.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)); } }
Ensuite, utilisez cette classe comme suit dans votre méthode de contrôleur MVC:
public ActionResult GetPerson() { return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)}; }
Pour WebAPI , consultez ce lien: http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx
Fondamentalement, ajoutez ce code à votre Application_Start
:
var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Je pense que c’est la réponse simple que vous recherchez. C’est à partir du blog de Shawn Wildermuth :
// Add MVC services to the services container. services.AddMvc() .AddJsonOptions(opts => { opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
Une alternative au filtre personnalisé consiste à créer une méthode d’extension pour sérialiser tout object en JSON.
public static class ObjectExtensions { /// Serializes the object to a JSON ssortingng. /// A JSON ssortingng representation of the object. public static ssortingng ToJson(this object value) { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { new SsortingngEnumConverter() } }; return JsonConvert.SerializeObject(value, settings); } }
Puis appelez-le en revenant de l’action du contrôleur.
return Content(person.ToJson(), "application/json");
Dans ASP.NET Core MVC.
public IActionResult Foo() { var data = GetData(); var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); return Json(data, settings); }
Vous trouverez ci-dessous une méthode d’action qui renvoie une chaîne json (cameCase) en sérialisant un tableau d’objects.
public ssortingng 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); }
Notez que l’instance JsonSerializerSettings est passée en second paramètre. C’est ce qui fait que le camelCase se produit.