[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


How Different Team Topologies Influence #DevOps Culture http://t.co/9qbuJyIBf0

September 02, 2015 17:28

An introduction to immutable infrastructure http://t.co/tmF9ntEqjP #DevOps

September 02, 2015 15:16

Immutable Infrastructure and Containers http://t.co/8EImSCPtzS #DevOps

September 02, 2015 13:17

Cloud, frozen pizza model and the immutable infrastructure http://t.co/OoaDtiq0oj #DevOps

September 02, 2015 12:01

Trash Your Servers and Burn Your Code: Immutable Infrastructure and Disposable Components http://t.co/g5LLgPvxy2 #DevOps

September 02, 2015 11:54

Amazon, Netflix, Google, Microsoft, Mozilla And Others Partner To Create Next-Gen Video Format http://t.co/mtfx6irVGE

September 02, 2015 09:37

Release Management vNext Plans http://t.co/da6TLhKNdX #VisualStudio #DevOps #VSO

September 02, 2015 08:21

#Microsoft announces new #Azure #ResourceManager SDKs (in preview) for #Java, #Python, #Go and #Ruby ! http://t.co/dxbpRh6q4p

September 02, 2015 07:01

#ContinuousDelivery - the missing parts http://t.co/QHg13iToLg #NDC2015

September 01, 2015 09:37

Demo: #Mesos Running a Single Cluster of #Linux and #Windows Machines http://t.co/YNiQbH33X5

September 01, 2015 08:21

Dino Esposito on CQRS, Messages and Events http://t.co/Vx1HDZvYxW

September 01, 2015 07:01

New update for the #Azure #MediaServices #Java SDK with support for Content Protection feature http://t.co/KSh8LW0vTe

August 31, 2015 13:54

A new version of the #Azure SDK for .NET (2.7.1) is available for #VisualStudio 2015 and 2013 ! http://t.co/e0gQGQhdyh

August 31, 2015 11:37

Excellent article sur les différents services de données de la plateforme #Cloud #Microsoft #Azure http://t.co/YhQMkQz3mC

August 31, 2015 09:21

How to Dockerize Your Development Machine http://t.co/DfrkEs98Q5 #Docker

August 31, 2015 08:01