【问题标题】:Deserializing json string with array of array with Json.NET使用 Json.NET 反序列化带有数组数组的 json 字符串
【发布时间】:2014-01-21 03:23:54
【问题描述】:
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.net 反序列化它的 json 字符串和类。如果我将公共List&lt;OneDay&gt; data { get; set; } 更改为public List&lt;object&gt; data { get; set; },它将起作用。但在这种情况下,我必须进一步做更多的步骤。有没有一种简洁的解决方案可以一次性反序列化它?

【问题讨论】:

    标签: c# arrays json json.net


    【解决方案1】:

    是的,您必须使用 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; }
    }
    

    结果:

    【讨论】:

    • Dump() 是 LINQPad 提供的扩展方法,用于提供您在上面的屏幕截图中看到的输出。你应该试试 LINQPad。
    • 谢谢Dominic,我会研究的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多