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?

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.


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 )


2
Czego szukałem! Jeszcze krócej:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé


18

W Twoim Global.asax.cs dodaj

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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.