2011-09-15 13 views
75

Voglio deserializzare le enumerazioni alla loro rappresentazione di stringa e viceversa con json.net. L'unico modo che ho potuto capire a dire il quadro di applicare la propria StringEnumConverter è quello di annotare le proprietà in questione in questo modo:Come dire a Json.Net a livello globale di applicare StringEnumConverter a tutte le enumerazioni

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

Tuttavia, nel mio caso d'uso, sarebbe molto più conveniente per configurare json.net globalmente tale che tutte le enumerazioni vengano (de) serializzate usando StringEnumConverter, senza bisogno di ulteriori annotazioni.

C'è un modo per farlo, ad es. con l'aiuto di custom JsonSerializerSettings?

risposta

106

Aggiungere un StringEnumConverter alla raccolta di convertitori JsonSerializerSettings.

Documentazione: Serialize with JsonConverters


Se si desidera che il serializzatore da utilizzare camelCasing, è possibile impostare anche questo:

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

Ciò serializzare SomeValue-someValue.

+0

Ho provato a impostarlo sul mio global.asax.cs in 'GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings' ma non ha funzionato. Qualche idea sul perché potrebbe essere? – amhed

+0

Esiste un modo per scrivere in minuscolo il nome del campo? Il flag CamelCaseText è hard-coded nella classe e non vedo un modo per utilizzare una diversa strategia di alloggiamento. – mikebridge

+0

@mikebridge Hai trovato una soluzione a questo? Sto anche cercando un modo per impostare il nome per ciascuna opzione enum (o usare le lettere minuscole). – Timm

18

Nei tuoi Global.asax.cs aggiungere

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

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

34

Le altre risposte lavorano per ASP.NET, ma se si desidera impostare queste impostazioni in generale per chiamare JsonConvert in qualsiasi contesto si può 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)

+1

Quello che stavo cercando! Ancora più breve: 'JsonConvert.DefaultSettings =() => new JsonSerializerSettings { Convertitori = {new StringEnumConverter {CamelCaseText = true}} };' –

0

per ASP.NET core 2 effettuare le seguenti operazioni:

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

     ... 

Si prega di notare che questo non è services.AddJsonOptions(...), deve essere codificato su MVC perché stai creando le impostazioni per MVC.

Problemi correlati