2013-02-08 16 views
20

Dato il seguente in C#:Serialize C# Enum Definizione a JSON

[Flags] 
public enum MyFlags { 
    None = 0, 
    First = 1 << 0, 
    Second = 1 << 1, 
    Third = 1 << 2, 
    Fourth = 1 << 3 
} 

Ci sono metodi esistenti in ServiceStack.Text per la serializzazione al seguente JSON?

{ 
    "MyFlags": { 
    "None": 0, 
    "First": 1, 
    "Second": 2, 
    "Third": 4, 
    "Fourth": 8 
    } 
} 

Attualmente sto usando la routine di seguito, ci sono modi migliori per farlo?

public static string ToJson(this Type type) 
    { 
     var stringBuilder = new StringBuilder(); 
     Array values = Enum.GetValues(type); 
     stringBuilder.Append(string.Format(@"{{ ""{0}"": {{", type.Name)); 

     foreach (Enum value in values) 
     { 
      stringBuilder.Append(
       string.Format(
        @"""{0}"": {1},", 
        Enum.GetName(typeof(Highlights), value), 
        Convert.ChangeType(value, value.GetTypeCode()))); 
     } 

     stringBuilder.Remove(stringBuilder.Length - 1, 1); 
     stringBuilder.Append("}}"); 
     return stringBuilder.ToString(); 
    } 
+1

1, del codice bello. BTW: 's/typeof (Highlights)/tipo/G' – Heinzi

+3

@GavinFaux un enum non è una collezione. Le enumerazioni sono come classi con costanti, quindi non trovo le "legal" serializzandole come oggetti o array associativi. –

+3

@ElYusubov: Non sono d'accordo, l'uscita desiderata è completamente diverso da quello in questione legata. – Heinzi

risposta

5

È meglio compilare uno Dictionary<string,int> o un DTO tipizzato e serializzarlo.

+0

Grazie, ho provato che inizialmente cercare i valori, ma è stato avendo alcuni problemi, avranno un altro sguardo. –

+1

Ci scusiamo per il duplicato, stavo cercando di vedere se c'era qualcosa già in ServiceStack, che è:. Enum.GetValues ​​(typeof (MyEnum)) OfType () .Dove (x => x = MyEnum.None!). ToDictionary (k => k.ToString(), v => (int) v) –

7
public static class EnumExtensions 
{ 
    public static string EnumToJson(this Type type) 
    { 
     if (!type.IsEnum) 
      throw new InvalidOperationException("enum expected"); 

     var results = 
      Enum.GetValues(type).Cast<object>() 
       .ToDictionary(enumValue => enumValue.ToString(), enumValue => (int) enumValue); 


     return string.Format("{{ \"{0}\" : {1} }}", type.Name, Newtonsoft.Json.JsonConvert.SerializeObject(results)); 

    } 
} 

Utilizzo di un dizionario per il sollevamento di carichi pesanti. Quindi usa Newton Jons convert per convertirlo in JSON. Ho solo dovuto fare un po 'di wrapping per aggiungere il nome del tipo.

+1

stavo lavorando su qualcosa di simile, ma mi ha battuto ad esso. Una modifica: puoi usare il 'JavaScriptSerializer 'incorporato invece di una libreria esterna. Vedi [qui] (http://stackoverflow.com/a/331983/298754) per esempio. – Bobson