Come dire a Json.Net a livello globale di applicare StringEnumConverter a tutte le enumerazioni


84

Voglio deserializzare le enumerazioni nella loro rappresentazione di stringa e viceversa con json.net. L'unico modo in cui ho potuto capire per dire al framework di applicarlo StringEnumConverterè annotare le proprietà in questione in questo modo:

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

Tuttavia, nel mio caso d'uso, sarebbe molto più conveniente configurare json.net globalmente in modo tale che tutte le enumerazioni vengano (de) serializzate utilizzando StringEnumConverter, senza la necessità di annotazioni aggiuntive.

C'è un modo per farlo, ad esempio con l'aiuto della personalizzazione JsonSerializerSettings?

Risposte:


113

Aggiungi un StringEnumConverteralla JsonSerializerSettingsraccolta Convertitori.

Documentazione: serializzare con JsonConverters


Se vuoi che il serializzatore usi camelCasing, puoi impostare anche questo:

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

Questo verrà serializzato SomeValuein someValue.


Ho provato a impostarlo sul mio global.asax.cs sotto GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsma non ha funzionato. Qualche idea sul perché potrebbe essere?
amhed

C'è un modo per scrivere in minuscolo il nome del campo? Il flag CamelCaseText è hardcoded nella classe e non vedo un modo per utilizzare una diversa strategia di maiuscole e minuscole.
Mikebridge

@mikebridge Hai trovato una soluzione a questo? Sto anche cercando un modo per impostare io stesso il nome per ogni opzione enum (o usare il minuscolo).
Timm

1
@Timm Sì, ho usato questo post: stackoverflow.com/questions/6288660/...
mikebridge

@mikebridge Thanks. Ho scoperto che [EnumMember (Value = "undefined")] per voce enum funziona bene anche con JSON.Net (sebbene non sia supportato dal deserializzatore JSON di Microsoft)
Timm

40

Le altre risposte funzionano per ASP.NET, ma se vuoi impostare queste impostazioni in generale per chiamare JsonConvert in qualsiasi contesto puoi fare:

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

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


2
Quello che stavo cercando! Ancora più breve:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé


18

Nel tuo Global.asax.cs aggiungi

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

Questa soluzione sembra funzionare perfettamente per la serializzazione WebAPI. Grazie!
charlie

5

Per ASP.NET Core 2, eseguire le operazioni seguenti:

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

        ...

Tieni presente che non lo è services.AddJsonOptions(...), deve essere taggato su MVC perché stai creando impostazioni per MVC.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.