2014-01-03 2 views
6
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; } на public List<object> data { get; set; }. Но в этом случае я должен сделать еще больше шагов. Есть ли опрятное решение для десериализации его за один раз?десериализации JSON строка массива из массива с Json.NET

ответ

5

Да, вы должны использовать класс 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; } 
} 

Результат:

enter image description here

+0

Nice, спасибо! dd.Dump(), очевидно, опечатка? – Dork

+1

Dump() - это метод расширения, предоставляемый LINQPad, который используется для предоставления вывода, который вы видите на скриншоте выше. Вы должны попробовать LINQPad. – sloth

+0

Поблагодари Доминика, я его изучу – Dork

Смежные вопросы