2013-09-05 6 views
33

Sie können eine ENUM-Feld in einem WebAPI Modell als String serialisiert werden durch ein Attribut hinzufügen:serialisiert einen Container von Aufzählungen als Strings mit JSON.net

enum Size 
{ 
    Small, 
    Medium, 
    Large 
} 

class Example1 
{ 
    [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] 
    Size Size { get; set; } 
} 

Das auf diese JSON serialisiert werden:

{ 
    "Size": "Medium" 
} 

Wie kann ich dasselbe für eine Sammlung von Enums erreichen?

class Example2 
{ 
    IList<Size> Sizes { get; set; } 
} 

Ich möchte dieses JSON serialisiert:

{ 
    "Sizes": 
    [ 
    "Medium", 
    "Large" 
    ] 
} 

Antwort

54

Sie benötigen JsonPropertyAttribute.ItemConverterType Eigenschaft verwenden:

class Example2 
{ 
    [JsonProperty (ItemConverterType = typeof(StringEnumConverter))] 
    public IList<Size> Sizes { get; set; } 
} 
+0

Also, wie man tatsächlich 'Sizes' bevölkert? – Burjua

+0

Vielen Dank, war für anderthalb Tage auf diesem fest – Eman

15

Ich habe dies in der Startup-Code meiner Web-App alle Aufzählungen in Strings serialise (ich ziehe Enum-Namen auf Werte vorbei, macht die Dinge robuster).

Muss zugeben, ich habe es noch nie auf einer Liste von Enums versucht, also weiß ich nicht, was es damit tun würde - könnte einen Versuch wert sein.

var jsonFormatter = config.Formatters.JsonFormatter; 
jsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter { CamelCaseText = true }); 
+0

Ja, dies wird mit einer Liste von Aufzählungen zu arbeiten. –

+0

Ich kann bestätigen, dass dies für eine Liste von Enums funktioniert. Meine ideale Lösung würde es erlauben, pro Grundstück zu wählen, aber das funktioniert und es ist besser als nichts. Vielen Dank! –

+0

@ Jon-Eric Athari Lösung funktioniert auch und wird Ihnen die pro-Eigenschaft Opt-in, die Sie suchen. –

Verwandte Themen