web-dev-qa-db-fra.com

Comment définir des JsonSerializerSettings personnalisés pour Json.NET dans l'API Web MVC 4?

Je comprends que l’API Web ASP.NET utilise nativement Json.NET pour la (dé) sérialisation des objets, mais existe-t-il un moyen de spécifier un objet JsonSerializerSettings que vous souhaitez utiliser?

Par exemple, si je voulais inclure les informations type dans la chaîne JSON sérialisée? Normalement, j'injecte des paramètres dans l'appel .Serialize(), mais l'API Web le fait en mode silencieux. Je n'arrive pas à trouver un moyen d'injecter les paramètres manuellement.

67

Vous pouvez personnaliser le JsonSerializerSettings en utilisant le Formatters.JsonFormatter.SerializerSettings propriété dans l'objet HttpConfiguration.

Par exemple, vous pouvez le faire dans la méthode Application_Start ():

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.Formatting =
        Newtonsoft.Json.Formatting.Indented;
}
106
carlosfigueira

Vous pouvez spécifier JsonSerializerSettings pour chaque JsonConvert et définir une valeur par défaut globale.

Unique JsonConvert avec une surcharge:

// Option #1.
JsonSerializerSettings config = new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore };
this.json = JsonConvert.SerializeObject(YourObject, Formatting.Indented, config);

// Option #2 (inline).
JsonConvert.SerializeObject(YourObject, Formatting.Indented,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    }
);

Paramètre global avec du code dans Application_Start() dans Global.asax.cs:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
     Formatting = Newtonsoft.Json.Formatting.Indented,
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};

Référence: https://github.com/JamesNK/Newtonsoft.Json/issues/78

36
smockle

Answer ajoute ces 2 lignes de code à la méthode Global.asax.cs Application_Start

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All;

Référence: Gestion des références d'objet circulaire

2
AEMLoviji