2015-07-30 8 views
7

Moje pytanie jest proste, ale nieco bardziej szczegółowe niż inne pytania związane z serializacją typów wyliczeniowych jako ciągów.C# - Web API - Serializing Enums jako ciągi ze spacjami

Rozważmy następujący fragment kodu:

using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 

public enum MyEnum 
{ 
    TypeOne, 
    TypeTwo, 
    TypeThree 
} 

public class Foo 
{ 
    [JsonConverter(typeof(StringEnumConverter))] 
    public MyEnum Types { get; set; } 
} 

Gdy sterownik Web API wysyła odcinkach obiektów Foo, mogą one wyglądać tak:

{ 
    "Type" : "TypeTwo" 
} 

Moje pytanie: jest to możliwe wysyłać serializowane wyliczenia jako łańcuchy ze spacjami przed każdą wielką literą? Takie rozwiązanie spowodowałoby powstanie JSON w następujący sposób:

{ 
    "Type" : "Type Two" 
} 

Daj mi znać, jeśli są jakieś dodatkowe informacje potrzebne do rozwiązania mojego problemu. Dzięki!

Edycja:

Jest korzystne, jeśli teksty stałe przekształca się jedynie łańcuchów z przestrzeni podczas szeregowania ich JSON. Chciałbym wykluczyć spacje podczas używania MyEnum.ToString() na zapleczu.

+1

Czy dodanie elementu EnumMemberAttribute '[EnumMember (" Type Two ")]' coś robi? Źródło StringEnumConverter na githubie wydaje się to wykorzystywać. –

+0

Nie jestem pewien, ale czy sądzisz, że użycie tego atrybutu będzie miało wpływ na każdą metodę 'MyEnum.ToString()'? – TheBrogrammer

Odpowiedz

13

spróbuj dodać EnumMember jak pokazano poniżej,

[JsonConverter(typeof(StringEnumConverter))] 
public enum MyEnum 
{ 
    [EnumMember(Value = "Type One")] 
    TypeOne, 
    [EnumMember(Value = "Type Two")] 
    TypeTwo, 
    [EnumMember(Value = "Type Three")] 
    TypeThree 
} 

Być może trzeba zainstalować pakiet o nazwie System.Runtime.Serialization.Primitives z Microsoft, aby użyć.

+0

To działa! I aby wyjaśnić moją edycję, spowoduje to wyłącznie serializację JSON. Dziękuję Ci! – TheBrogrammer

+0

this (http://stackoverflow.com/a/19768223/530933) może również być pomocne. [JsonConverter (typeof (StringEnumConverter))] u góry enum –

-1

Uważam, że można dodać atrybut opisu do swoich wyliczeń, a następnie spróbować wyciągnąć to w celu serializacji. Zapoznaj się z this SO Answer. Mam nadzieję że to pomoże.

public enum MyEnum 
{  
    [Description("Type One")] 
    TypeOne,  
    [Description("Type Two")] 
    TypeTwo, 
    ... 
} 
+1

Czy ten opis zastąpi domyślną wartość zwróconą przez 'MyEnum.TypeOne.ToString()'? – TheBrogrammer

+0

Nie sądzę, myślę, że ToString próbuje wziąć wartość enum. Odpowiadałem na serializację, ale powinno się wyjaśnić szybkie sprawdzenie VS. – OverMars

+0

to nie działa – Slava