82 votes

Comment définir des paramètres JsonSerializerSettings personnalisés pour Json.NET dans l'API Web ASP.NET ?

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 une JsonSerializerSettings que vous voulez qu'il utilise ?

Par exemple, si je voulais inclure type dans la chaîne JSON sérialisée ? Normalement, j'injecterais les paramètres dans la chaîne .Serialize() mais l'API Web le fait en silence. Je ne trouve pas de moyen d'injecter les paramètres manuellement.

119voto

carlosfigueira Points 40778

Vous pouvez personnaliser le JsonSerializerSettings en utilisant le Formatters.JsonFormatter.SerializerSettings dans le HttpConfiguration objet.

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;
}

1 votes

Je n'arrive pas à le faire fonctionner dans une application ASP.NET avec HangFire installé. Il fait référence à la mauvaise bibliothèque ou quelque chose comme ça. J'ai dû utiliser l'autre réponse avec les paramètres par défaut

0 votes

Vous pouvez le faire par contrôleur ou par action : stackoverflow.com/questions/44499041/

46voto

smockle Points 397

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

Simple 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
    }
);

Réglage global avec le 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

4 votes

Pour info, j'ai d'abord essayé la deuxième méthode, ce qui a fait pas travail. J'ai dû utiliser HttpConfiguration au lieu de comme dans La réponse de carlosfigueira comme les paramètres configurés dans JsonConvert.DefaultSettings n'ont pas été observées.

2 votes

Dans mon cas, le paramètre global utilise JsonSerializerSettings c'est ce qui a marché pour moi. Je n'arrivais pas à faire fonctionner la configuration HttpCOnfiguration, elle revenait avec les méthodes d'un autre assemblage (Hangifre), je ne sais pas trop pourquoi.

0 votes

Puis-je utiliser un champ caché ? formHiddenField.Value = JsonConvert.SerializeObject(listaCursos, Formatting.Indented, jsonSerializerSettings); et utiliser JQuery pour obtenir la valeur var data = $('#formHiddenField').val(); ?

1voto

AEMLoviji Points 1189

La réponse est d'ajouter ces 2 lignes de code à la méthode Application_Start de Global.asax.cs

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

Référence : Gestion des références d'objets circulaires

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X