我正在使用json.net,我有问题从服务器反序列化json响应我不知道我应该为两个属性errors
和data
使用什么数据类型。
有没有办法如何排除其他属性但这两个?服务器返回了大量我不感兴趣的数据。
此外,我在类Data
中使数据类型可以为空,因为当值未知时,服务器返回null是解决此问题的正确方法吗?
class DataFormat
{
[JsonProperty("errors")]
public Object Errors { get; set; }
...
[JsonProperty("data")]
public List<Data> Data { get; set; }
}
class Data
{
public DateTime Date { get; set; }
public double? Open { get; set; }
public double? High { get; set; }
public double? Low { get; set; }
public double? Last { get; set; }
public double? Change { get; set; }
public double? Settle { get; set; }
public int? Volume { get; set; }
public int? OpenInterest { get; set; }
}
json我试图反序列化
{
"errors": {},
...
"data": [
["2014-06-13", 2.9959, 3.0302, 2.9853, 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]]
}
答案 0 :(得分:2)
要排除您不感兴趣的JSON属性,只需将这些成员留在您的课程之外。 Json.Net默认会忽略它们。
如果JSON中的数值或日期值可以为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]
课程中的Data
成员添加DataFormat
属性:
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
答案 1 :(得分:0)
数据包含一个数组数组,而不是一个对象数组。
class DataFormat
{
[JsonProperty("errors")]
public Object Errors { get; set; }
...
[JsonProperty("data")]
public List<List<object>> Data { get; set; }
}