[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


La télémétrie et la supervision dans #Azure c'est simple, avec #AppInsights ! #GlobalAzure #Paris @michelhubert http://t.co/zCfhJuUusN

April 25, 2015 13:01

RT @MCKLMT: Cloud computing et scalabilité dans le monde eCommerce par @MichelHubert au #GlobalAzure Bootcamp #Paris http://t.co/SHprFaqBnD

April 25, 2015 12:28

@aymericw fait monter la température au #GlobalAzure bootcamp ! #IoT #EventHub http://t.co/Aao77WXIEY

April 25, 2015 11:55

@JeanLucBoucho nous parle de #KeyVault, le service de stockage de données sécurisé en preview ! #GlobalAzure http://t.co/3TSj9FMbgD

April 25, 2015 09:38

RT @Azure_France: Scalabilité avec #Azure #DocumentDB et #SQLDatabase #ElasticScale par @JeanLucBoucho au #GlobalAzure bootcamp

April 25, 2015 09:14

#Azure #SQLDatabase v12, c'est 99,99% de SLA mensuel ! Ça envoie du steak non ? #GlobalAzure

April 25, 2015 09:13

@preguntoncabron we are not webasting in Paris, but slides and demos will be on @ZeCloud website in a few days

April 25, 2015 09:06

Les options pour stocker de la donnée persistante dans #Azure sont nombreuses, en #IaaS ou en #PaaS ! #GlobalAzure http://t.co/yMd1TVZORB

April 25, 2015 08:54

RT @Azure_France: Toutes les nouveautés sur le stockage de données dans #Azure par @JeanLucBoucho au #GlobalAzure bootcamp avec la communau…

April 25, 2015 08:48

@JeanLucBoucho nous présente les dernières nouveautés sur le stockage de données dans #Azure ! #GlobalAzure http://t.co/vsB4S5MmpW

April 25, 2015 08:45

RT @davidlindblad: @serbrech talking about actors in project orleans #globalazure http://t.co/VggyAUrFvH

April 25, 2015 08:40

AppService vous permet de développer des applications web / mobiles #WebApp #MobileApp #ApiApp #LogicApp #GlobalAzure http://t.co/2SA2tBNNAO

April 25, 2015 08:21

RT @MCKLMT: Bref, @canalplus a utilisé @Azure pour créer le générateur de Bref pour ses 30 ans. #GlobalAzure #Paris http://t.co/vUDPDBUEDN

April 25, 2015 08:15

#Azure et #Bref pour les 30 ans de canal plus. Bref, utilisez Azure ! #GlobalAzure http://t.co/q2iHtaCd2x

April 25, 2015 08:13