[ASPNET MVC] Utiliser le framework Json .NET de Newtonsoft à la place du JavaScriptSerializer dans vos JsonResult

March 05, 2013 -

ASP.NET MVC fait appel au JavaScriptSerializer lorsque l’on retourne un JsonResult, contrairement à ASP.NET Web API qui lui utilise nativement le Framework Json.NET de Newtonsoft. Cela peut entraîner des comportements assez étranges dans le cas d’intéropérabilité entre une application MVC et un service Web API.

Concrètement, le framework Json.NET est beaucoup plus riche que le JavaScriptSerializer pour la manipulation d’objets JSON, du coup, il est clairement recommandé de l’utiliser, même en ASP.NET MVC. Pour le récupérer, il suffit de télécharger le package NuGet Json.NET :

image

La première étape consiste à créer un ActionResult personnalisé qui utilise Json.NET dans la méthode ExecuteResult :

public class JsonNetResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        if (Data == null)
            return;

        var serializedObject = JsonConvert.SerializeObject(Data, Formatting.Indented);
        response.Write(serializedObject);
    }
}

Ensuite, pour pouvoir faire en sorte que ce soit ce JsonNetResult là qui soit automatiquement renvoyé par la méthode Json de vos contrôleurs, il suffit de passer par un contrôleur intermédiaire dans lequel vous pouvez redéfinir les différentes surcharges de la méthode Json, et notamment :

protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    var result = new JsonNetResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };

    return result;
}

Désormais, tous les contrôleurs qui dérivent de votre contrôleur de base utiliseront automatiquement Json.NET pour sérialiser des objets en Json. Au passage, c’est toujours une bonne pratique de créer votre propre contrôleur au démarrage d’un projet (ou dans un Framework) pour pouvoir à tout moment influer sur le comportement de tous vos contrôleurs sans impacter votre code !

Enjoy Winking smile

Julien

Comments

Share

Tags


Twitter


Journey to the #Kubernetes from Legacy docker environment on #Azure with VSTS https://t.co/qUeqVMjYOb

February 25, 2017 09:57

Announcing new @Azure #Functions capabilities to accelerate development of #serverless applications https://t.co/g06gTqmpZt

February 24, 2017 10:30

Get ready for the 4 big trends in #hybrid #cloud https://t.co/QN2tDF1ISr

February 24, 2017 10:27

Announcing the first SHA1 collision https://t.co/lPuCahTbz8

February 24, 2017 08:08

The Future of #Microscaling and the Current State of #Container Deployments https://t.co/FTaUkTNlLj

February 23, 2017 07:56

#Azure #Functions Proxies public preview https://t.co/kOnHvLo9Sw #serverless #microservice

February 23, 2017 07:30

Choose between Flow, Logic Apps, Functions, and WebJobs https://t.co/SEAwKYftQ4

February 22, 2017 15:06

RT @benjiiim: #HackFest @Azure with several @euratechnologie startups this week with @cderue & @jcorioland ! https://t.co/42nlFoBJG2

February 22, 2017 10:35

RT @kubernetesio: The #Microservices Hierarchy of Needs, and the impact of Kubernetes https://t.co/F6tmKALcKe via @thenewstack by @bibryam

February 21, 2017 20:54

#Kubernetes rounds out #Azure options, paves way for #Windows Server Containers https://t.co/LOPkiP7cSI

February 21, 2017 20:51

#SQLServer 2016 Developer Edition in #Windows #Containers https://t.co/iLOlylSvvY

February 21, 2017 20:05

Containers as a Service, the foundation for next generation PaaS https://t.co/0AcN3hB1ao #Kubernetes

February 21, 2017 18:29

#Whitepaper: Deploying #Microservices and #Containers with @Azure #Container Service and DC/OS https://t.co/FkoI0R1kH9

February 21, 2017 18:25

#Kubernetes now Generally Available on #Azure #Container Service https://t.co/aaSwBnOnld

February 21, 2017 17:34

Roadmap #Linux, #Docker et stratégie open source sur @Azure https://t.co/ay4pHWigLl

February 20, 2017 10:30