2013-10-20 56 views
0

我怎樣才能將json反序列化爲C#中的枚舉列表?從json轉換爲Enum和Newtonsoft C#

我寫了下面的代碼:

//json "types" : [ "hotel", "spa" ] 

    public enum eType 
    { 
     [Description("hotel")] 
     kHotel, 
     [Description("spa")] 
     kSpa 
    } 

    public class HType 
    { 
     List<eType> m_types; 

     [JsonProperty("types")] 
     public List<eType> HTypes { 
     get 
      { 
       return m_types; 
      } 
      set 
      { 
      // i did this to try and decide in the setter 
      // what enum value should be for each type 
      // making use of the Description attribute 
      // but throws an exception 
      } 

}}

 //other class 

       var hTypes = JsonConvert.DeserializeObject<HType>(json); 
+1

到底是什麼問題了嗎?反序列化HType對象也會反序列化其成員,包括HType列表。如果它不在你的情況下,請發佈一個帶有序列化HType對象的示例JSON文件。 – elgonzo

+0

它不會反序列化爲Enum,它不知道該怎麼做。我的問題是如何從示例反序列化JSON到枚舉條目。 –

回答

4

定製轉換器可能會有幫助。

var hType = JsonConvert.DeserializeObject<HType>(
          @"{""types"" : [ ""hotel"", ""spa"" ]}", 
          new MyEnumConverter()); 

public class HType 
{ 
    public List<eType> types { set; get; } 
} 

public enum eType 
{ 
    [Description("hotel")] 
    kHotel, 
    [Description("spa")] 
    kSpa 
} 

public class MyEnumConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(eType); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var eTypeVal = typeof(eType).GetMembers() 
         .Where(x => x.GetCustomAttributes(typeof(DescriptionAttribute)).Any()) 
         .FirstOrDefault(x => ((DescriptionAttribute)x.GetCustomAttribute(typeof(DescriptionAttribute))).Description == (string)reader.Value); 

     if (eTypeVal == null) return Enum.Parse(typeof(eType), (string)reader.Value); 

     return Enum.Parse(typeof(eType), eTypeVal.Name); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

儘管較舊的Json.NET版本遭受了一個不完整的(或有問題的)StringEnumConverter,但這個問題已經在大約一年左右的時間裏得到了修復(iirc)。現在,你只需要添加Json.NET的StringEnumConverter到串行器設置,並且Bob的你的叔叔... – elgonzo

+0

@elgonzo我知道有人會評論這:)只是試試看,它不會工作。如果您確定,請將其作爲工作代碼的答案發布。 –

+0

是的,它的確如此。我使用它,包括StringEnumConverter來反序列化枚舉字符串 - 這甚至可以與標記枚舉一起使用。 :-)你使用哪個Json.NET版本?我正在使用Json.NET 5.0.6.16206(.NET 4.0的DLL)。 – elgonzo