使用数组反序列化响应

时间:2014-06-17 11:18:45

标签: c# json json.net deserialization

我正在使用json.net,我有问题从服务器反序列化json响应我不知道我应该为两个属性errorsdata使用什么数据类型。

有没有办法如何排除其他属性但这两个?服务器返回了大量我不感兴趣的数据。

此外,我在类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]]
}

2 个答案:

答案 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; }    
}