2013-02-08 2 views
20

Учитывая следующее C#:Serialize C# Enum Определение к Json

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

Существуют ли методы в ServiceStack.Text для сериализации следующей JSON?

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

В настоящее время я использую подпрограмму ниже, есть ли лучшие способы сделать это?

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, хороший код. BTW: 's/typeof (Highlights)/type/g' – Heinzi

+3

@GavinFaux Перечисление не является коллекцией. Перечисления похожи на классы с константами, поэтому я не нахожу «законную» сериализацию их как объектов или ассоциативных массивов. –

+3

@ElYusubov: Я не согласен, желаемый результат полностью отличается от заданного в связанном вопросе. – Heinzi

ответ

5

Вы лучше заселять Dictionary<string,int> или типизированного DTO и сериализации, что.

+0

Спасибо, я попробовал это сначала с поиском значений, но имел некоторые проблемы, будет иметь другой вид. –

+1

Простите за дубликат, я искал, есть ли что-нибудь уже в ServiceStack, которое есть: Enum.GetValues ​​(typeof (MyEnum)). OfType () .Where (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)); 

    } 
} 

Использование словаря для тяжелой атлетики. Затем с помощью преобразования json от Newtonsoft, чтобы преобразовать это в json. Мне просто нужно было немного обернуть, чтобы добавить имя типа.

+1

Я работал над чем-то подобным, но вы избили меня. Одна модификация: вы можете использовать встроенный JavaScriptSerializer вместо внешней библиотеки. См. Здесь [здесь] (http://stackoverflow.com/a/331983/298754). – Bobson