web-dev-qa-db-fra.com

Comment dire à Json.Net globalement d'appliquer le StringEnumConverter à toutes les énumérations

Je veux désérialiser les énumérations à leur représentation de chaîne et vice versa avec json.net. La seule façon que j'ai pu trouver pour dire au framework d'appliquer son StringEnumConverter est d'annoter les propriétés en question comme ceci:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

Cependant, dans mon cas d'utilisation, il serait beaucoup plus pratique de configurer json.net globalement de sorte que toutes les énumérations soient (dé) sérialisées à l'aide de StringEnumConverter, sans avoir besoin d'annotations supplémentaires.

Existe-t-il un moyen de le faire, par exemple avec l'aide de JsonSerializerSettings personnalisé?

80
Leo

Ajoutez un StringEnumConverter à la collection JsonSerializerSettings Converters.

Documentation: Sérialiser avec JsonConverters


Si vous souhaitez que le sérialiseur utilise camelCasing, vous pouvez également définir ceci:

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });

Cela sérialisera SomeValue en someValue.

109
James Newton-King

Les autres réponses fonctionnent pour ASP.NET, mais si vous souhaitez définir ces paramètres généralement pour appeler JsonConvert dans n'importe quel contexte, vous pouvez le faire:

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

(Voir http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data )

37
Gaz

Dans votre Global.asax.cs, ajoutez

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
18
Iggy

Pour ASP.NET Core 2, procédez comme suit:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...

Veuillez noter que ce n'est pas services.AddJsonOptions(...), il doit être balisé sur MVC car vous créez des paramètres pour MVC.

3
Simon_Weaver

Les réponses précédentes sont obsolètes depuis la version 12.0.1. La nouvelle méthode consiste à utiliser NamingStrategy. https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

serializerSettings.Converters.Add(
    new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);
0
Stephen