繁体   English   中英

使用Json.NET使用数组数组反序列化json字符串

[英]Deserializing json string with array of array with Json.NET

string json = @"{
'symbol':'XX',
'column_names":["Date","Open","High","Low","Close","Volume"],
'data':[
['2014-01-02',25.78,25.82,25.47,25.79,31843697.0],
['2013-12-31',25.81,26.04,25.77,25.96,22809682.0]]}";

public class DailyData
{
    public string symbol { get; set; }
    public List<OneDay> data { get; set; }
}

public class OneDay
{
     public DateTime date { get; set; }
     public double open { get; set; }
     public double high { get; set; }
     public double low { get; set; }
     public double close { get; set; }
     public double volume { get; set; }
}

DailyData dd = JsonConvert.DeserializeObject<DailyData>(json);

这是我的json字符串和类我试图用Json.net反序列化它。 如果我更改公共List<OneDay> data { get; set; } List<OneDay> data { get; set; } List<OneDay> data { get; set; }public List<object> data { get; set; } public List<object> data { get; set; } public List<object> data { get; set; } 但在这种情况下,我还需要做更多的工作。 是否有一个简洁的解决方案可以一次性反序列化?

是的,您必须使用JsonConverter类来告诉反序列化器如何将值数组映射到OneDay类。

例:

void Main()
{
    string json = @"{
                        'symbol':'XX',
                        'column_names':['Date','Open','High','Low','Close','Volume'],
                        'data':[
                            ['2014-01-02',25.78,25.82,25.47,25.79,31843697.0],
                            ['2013-12-31',25.81,26.04,25.77,25.96,22809682.0]
                                ]
                    }";

    DailyData dd = JsonConvert.DeserializeObject<DailyData>(json);
    dd.Dump();
}

class OneDayJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        OneDay obj = new OneDay();
        obj.date = reader.ReadAsDateTime() ?? DateTime.MinValue;
        obj.open = (double)(reader.ReadAsDecimal() ?? 0);
        obj.high = (double)(reader.ReadAsDecimal()?? 0);
        obj.low = (double)(reader.ReadAsDecimal() ?? 0);
        obj.close = (double)(reader.ReadAsDecimal() ?? 0);
        obj.volume = (double)(reader.ReadAsDecimal() ?? 0);
        reader.Read(); 
        return obj;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

public class DailyData
{
    public string symbol { get; set; }
    public List<OneDay> data { get; set; }
}

[JsonConverter(typeof(OneDayJsonConverter))]
public class OneDay
{
    public DateTime date { get; set; }
    public double open { get; set; }
    public double high { get; set; }
    public double low { get; set; }
    public double close { get; set; }
    public double volume { get; set; }
}

结果:

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM