2013-02-08 12 views
20

Do sau trong C#:Serialize C# Enum Definition để Json

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

Có bất kỳ phương pháp hiện tại ServiceStack.Text cho serializing để JSON sau đây?

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

Hiện tại tôi đang sử dụng thường trình bên dưới, có cách nào tốt hơn để thực hiện việc này không?

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, mã đẹp. BTW: 's/typeof (Điểm nổi bật)/type/g' – Heinzi

+3

@GavinFaux An enum không phải là một bộ sưu tập. Enums giống như các lớp với hằng số, do đó tôi không tìm thấy "hợp pháp" tuần tự hóa chúng như là các đối tượng hoặc mảng kết hợp. –

+3

@ElYusubov: Tôi không đồng ý, kết quả mong muốn hoàn toàn khác với kết quả đầu ra trong câu hỏi được liên kết. – Heinzi

Trả lời

5

Bạn nên điền một số Dictionary<string,int> hoặc một DTO đã nhập và tuần tự hóa.

+0

Cảm ơn, tôi đã cố gắng ban đầu với giá trị tra cứu nhưng đã có một số vấn đề, sẽ có một cái nhìn khác. –

+1

Xin lỗi vì trùng lặp, tôi đang tìm xem có bất kỳ thứ gì đã có trong ServiceStack không, đó là: 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)); 

    } 
} 

Sử dụng từ điển để thực hiện việc nâng hạng nặng. Sau đó, sử dụng json của Newtonsoft chuyển đổi để chuyển đổi thành json. Tôi chỉ cần làm một chút để gói thêm tên kiểu.

+1

Tôi đã làm việc trên một cái gì đó như thế này, nhưng bạn đánh bại tôi với nó. Một sửa đổi: Bạn có thể sử dụng 'JavaScriptSerializer' dựng sẵn thay vì một thư viện bên ngoài. Xem [ở đây] (http://stackoverflow.com/a/331983/298754) ví dụ. – Bobson