您需要实现自定义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());
您发布的内容无效JSON。使用[JSONLint](http://jsonlint.com/)来验证您的JSON。 – rufer7
@ rufer7,小修复 – demo
'data'属性怎么样,你需要忽略它吗? –