Sérialisation JSON correcte dans MVC 4

J’aimerais que JSON soit sérieusement sérialisé (camelCase) et que vous puissiez modifier les formats de date si nécessaire.

Pour Web API, c’est très facile – dans le fichier Global.asax, j’exécute le code suivant

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

Ce code, au niveau du pipeline, gère la sérialisation comme je le souhaite.

Je voudrais accomplir la même chose dans MVC 4 – faire en sorte que tout JSON renvoyé par les méthodes d’action du contrôleur soit sérialisé correctement. Avec une petite recherche, j’ai trouvé le code suivant à lancer dans le démarrage de l’application Global.asax:

 HttpConfiguration config = GlobalConfiguration.Configuration; Int32 index = config.Formatters.IndexOf(config.Formatters.JsonFormatter); config.Formatters[index] = new JsonMediaTypeFormatter { SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() } }; 

Il semble bien fonctionner, mais lorsque je retourne JSON depuis un contrôleur, tout est PascalCased. Un exemple simple de ma méthode d’action:

 private JsonResult GetJsonTest() { var returnData = dataLayer.GetSomeObject(); return Json(returnData, JsonRequestBehavior.AllowGet); } 

Est-ce que je me trompe? Une idée de comment y parvenir au niveau du pipeline?

Je recommande d’utiliser quelque chose comme ServiceStack ou Json.NET pour gérer la sortie Json dans votre application MVC. Cependant, vous pouvez facilement écrire une classe et remplacer la méthode Json par une classe de base. Voir mon exemple ci-dessous.

Remarque: avec cela, vous n’avez besoin de rien dans votre fichier Global.ascx.cs.

Classe JsonDotNetResult personnalisée:

 public class JsonDotNetResult : JsonResult { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { new SsortingngEnumConverter() } }; public override void ExecuteResult(ControllerContext context) { if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && ssortingng.Equals(context.HttpContext.Request.HttpMethod, "GET", SsortingngComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("GET request not allowed"); } var response = context.HttpContext.Response; response.ContentType = !ssortingng.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json"; if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; } if (this.Data == null) { return; } response.Write(JsonConvert.SerializeObject(this.Data, Settings)); } } 

Classe du contrôleur de base:

 public abstract class Controller : System.Web.Mvc.Controller { protected override JsonResult Json(object data, ssortingng contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonDotNetResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior }; } } 

Maintenant, sur l’action de votre contrôleur, vous pouvez simplement retourner quelque chose comme ça.

 return Json(myObject, JsonRequestBehavior.AllowGet); 

BAM. Vous avez maintenant des objects camelcase retournés avec Json 🙂

REMARQUE: Il existe des moyens de procéder avec les parameters du sérialiseur sur chaque object que vous créez avec Json. Mais qui voudrait le taper chaque fois que vous voulez retourner Json?

Alors que l’API Web utilise JSON.NET, MVC4 utilise par défaut JavaScriptSerializer, et je ne pense pas qu’il prenne en charge la modification de la sérialisation de Case Camel. Vérifiez ceci: Définition du sérialiseur JSON par défaut dans ASP.NET MVC

Je vous suggère de créer un JsonNetResult personnalisé comme décrit ici Utilisation de JSON.NET comme sérialiseur JSON par défaut dans ASP.NET MVC 3 – est-ce possible? et changez la dernière ligne à:

 var serializedObject = JsonConvert.SerializeObject( Data, Formatting.Indented, , new JsonSerializerSettings { MappingResolver = new CamelCaseMappingResolver() }); 
 Note that below information is for Asp .Net core 

L’équipe .Net a récemment annoncé que MVC sérialise maintenant JSON avec les noms de cas camel par défaut.

Avec quelques lignes ci-dessous, vous pourrez activer cette fonctionnalité:

 services .AddMvc() .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); 

J’ai écrit un petit blog sur le même qui est ici .