Jak powiedzieć Json.Net globalnie, aby zastosować StringEnumConverter do wszystkich wyliczeń

84

Chcę deserializować wyliczenia do ich reprezentacji w postaci ciągów i odwrotnie z json.net. Jedynym sposobem, w jaki mogłem wymyślić, aby powiedzieć ramowi, aby zastosować jego, StringEnumConverterjest dodanie adnotacji do właściwości, o których mowa, w następujący sposób:

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

Jednak w moim przypadku użycia byłoby znacznie wygodniej skonfigurować json.net globalnie tak, aby wszystkie wyliczenia były (de) serializowane przy użyciu StringEnumConverter, bez potrzeby dodawania dodatkowych adnotacji.

Czy można to zrobić, np. Przy pomocy zwyczaju JsonSerializerSettings?

Lew
źródło

Odpowiedzi:

113

Dodaj StringEnumConverterdo JsonSerializerSettingskolekcji Converters.

Dokumentacja: Serializacja za pomocą JsonConverters


Jeśli chcesz, aby serializator używał camelCasing, możesz również ustawić to:

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

Spowoduje to serializację SomeValuedo someValue.

James Newton-King
źródło
Próbowałem ustawić to na moim global.asax.cs pod, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsale nie zadziałało. Masz jakiś pomysł, dlaczego tak może być?
amhed
Czy istnieje sposób na małe litery w nazwie pola? Flaga CamelCaseText jest na stałe zakodowana w klasie i nie widzę sposobu na użycie innej strategii wielkości liter.
mikebridge
@mikebridge Czy znalazłeś rozwiązanie tego problemu? Szukam również sposobu na samodzielne ustawienie nazwy dla każdej opcji wyliczenia (lub użycie małych liter).
Timm
1
@Timm Tak, użyłem tego posta: stackoverflow.com/questions/6288660/…
mikebridge
@mikebridge Thanks. Zauważyłem, że [EnumMember (Value = "undefined")] na wpis wyliczenia działa również dobrze z JSON.Net (choć nie jest obsługiwane przez deserializator JSON firmy Microsoft)
Timm
40

Inne odpowiedzi działają dla ASP.NET, ale jeśli chcesz ustawić te ustawienia ogólnie do wywoływania JsonConvert w dowolnym kontekście, możesz to zrobić:

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

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

Gaz
źródło
2
Czego szukałem! Jeszcze krócej:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé
Uratowałeś mnie! Dzięki stary! gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez
18

W Twoim Global.asax.cs dodaj

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
Iggy
źródło
To rozwiązanie wydaje się działać idealnie w przypadku serializacji WebAPI. Dzięki!
charlie
5

W przypadku ASP.NET Core 2 wykonaj następujące czynności:

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

        ...

Pamiętaj, że tak nie jest services.AddJsonOptions(...), musi być oznaczony tagiem w MVC, ponieważ tworzysz ustawienia dla MVC.

Simon_Weaver
źródło