要排除您不感兴趣的 JSON 属性,只需将这些成员排除在您的班级之外。 Json.Net 默认会忽略它们。
如果 JSON 中的数字或日期值可以为 null,那么在您的类中使其可以为 null 正是处理它的正确方法。
如果您不确定要制作Error 的类型,那么object 是可以的。你也可以在这里使用Dictionary<string, object>。如果您有 Error 数据的示例,那么您可以为它创建一个适当的类。
您可以使用JsonConverter 将数组数据转换为您想要的对象格式。
以下是转换器的外观:
public class DataListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Data);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken array = JToken.Load(reader);
List<Data> list = new List<Data>();
foreach (JArray data in array.Children<JArray>())
{
list.Add(new Data
{
Date = data[0].ToObject<DateTime>(),
Open = data[1].ToObject<double?>(),
High = data[2].ToObject<double?>(),
Low = data[3].ToObject<double?>(),
Last = data[4].ToObject<double?>(),
Change = data[5].ToObject<double?>(),
Settle = data[6].ToObject<double?>(),
Volume = data[7].ToObject<int?>(),
OpenInterest = data[8].ToObject<int?>()
});
}
return list;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用它,只需将[JsonConverter] 属性添加到DataFormat 类中的Data 成员:
class DataFormat
{
[JsonProperty("errors")]
public Dictionary<string, object> Errors { get; set; }
[JsonProperty("data")]
[JsonConverter(typeof(DataListConverter))]
public List<Data> Data { get; set; }
}
然后,您可以正常反序列化:
DataFormat df = JsonConvert.DeserializeObject<DataFormat>(json);
这是一个演示:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""errors"": {},
""stuffToIgnore"" : ""foo bar"",
""data"": [
[""2014-06-13"", 2.9959, 3.0302, 2.9853, 0.0838, null, 2.9943, 27331.0, 51662.0],
[""2014-06-12"", 2.9092, 3.0017, 2.908, null, 0.0838, 2.9948, 35321.0, 47057.0]
]
}";
DataFormat df = JsonConvert.DeserializeObject<DataFormat>(json);
foreach (Data item in df.Data)
{
Console.WriteLine("Date: " + item.Date.ToShortDateString());
Console.WriteLine("Open: " + item.Open);
Console.WriteLine("High: " + item.High);
Console.WriteLine("Low: " + item.Low);
Console.WriteLine("Last: " + item.Last);
Console.WriteLine("Change: " + item.Change);
Console.WriteLine("Settle: " + item.Settle);
Console.WriteLine("Volume: " + item.Volume);
Console.WriteLine("OpenInterest: " + item.OpenInterest);
Console.WriteLine();
}
}
}
输出:
Date: 6/13/2014
Open: 2.9959
High: 3.0302
Low: 2.9853
Last: 0.0838
Change:
Settle: 2.9943
Volume: 27331
OpenInterest: 51662
Date: 6/12/2014
Open: 2.9092
High: 3.0017
Low: 2.908
Last:
Change: 0.0838
Settle: 2.9948
Volume: 35321
OpenInterest: 47057