2017-04-05 60 views
0
{ 
    "data" : { 
       "TTyTo3qHkFq8b-KsIHZOlQ" : { 
         "2016-05-01" : { 
          "value1" : 11, 
          "value2" : 87 
         }, 
         "2016-05-02" : { 
          "value1" : 2, 
          "value2" : 34 
         } 
       } 
    } 
} 

我有这个json。 我可以分析它变成下一个对象Dictionary<string, Dictionary<DateTime, Dictionary<string, int>>>解析json到带有自定义类的字典中

如何从这个对象类似Dictionary<string, CustomClass1>做,其中

class CustomClass1 { 
    DateTime Date {get;set;} 
    Dictionary<string, int> Value {get;set;} 
} 

对于非实现我使用的是Json.NET。

+0

您发布的内容无效JSON。使用[JSONLint](http://jsonlint.com/)来验证您的JSON。 – rufer7

+0

@ rufer7,小修复 – demo

+0

'data'属性怎么样,你需要忽略它吗? –

回答

0

您需要实现自定义JsonConverter才能达到您想要的效果。

首先,你需要创建Root类,将代表整个JSON:

public class Root 
{ 
    public Dictionary<string, List<CustomClass1>> Data { get; set; } 
} 

public class CustomClass1 
{ 
    public DateTime Date { get; set; } 

    public Dictionary<string, int> Values { get; set; } 
} 

请注意这是Dictionary<string, List<CustomClass1>>,因为你将不能够反序列化到需要的类型Data的数据类型:Dictionary<string, CustomClass1>

之后,你需要实现自己的自定义JsonConverter

public class CustomClassConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     //Implement if needed 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var obj = (JObject)JObject.ReadFrom(reader); 

     var root = new Root(); 
     root.Data = new Dictionary<string, List<CustomClass1>>(); 

     JObject value = (JObject)obj.GetValue("data"); 
     foreach (JProperty prop1 in value.Properties()) 
     { 
      var customObjects = new List<CustomClass1>(); 
      foreach (JProperty prop2 in prop1.Values()) 
      { 
       var customObject = new CustomClass1(); 
       customObject.Date = DateTime.Parse(prop2.Name); 
       customObject.Values = new Dictionary<string, int>(); 
       foreach (JProperty prop3 in prop2.Values()) 
       { 
        customObject.Values.Add(prop3.Name, prop3.ToObject<int>()); 
       } 
       customObjects.Add(customObject); 
      } 
      root.Data.Add(prop1.Name, customObjects); 
     } 

     return root; 
    } 

    public override bool CanConvert(Type t) 
    { 
     return t.Equals(typeof(Root)); //Converter which handles only Root types 
    } 

    public override bool CanRead 
    { 
     get { return true; } 
    } 
} 

最后将它传递到DeserializeObject方法重载:

var root = JsonConvert.DeserializeObject<Root>(json, new CustomClassConverter());