2012-06-12 5 views
1

У меня есть выход JSON, что мне нужно для десериализации в .NET объект:десериализации массив в Json.NET

{ "title": "Stock data", 
    "raw_data": [ 
    [ 
     1088553600000, 
     1.3635 
    ], 
    [ 
     1091232000000, 
     1.3538 
    ], 
    [ 
     1093910400000, 
     1.3563 
    ]] 
} 

Если я использую JsonConvert, как я должен структурировать свой класс, так что десериализации работы ?

+1

Какие типы в «raw_data», что вы ожидали? Int и double, или они оба удваиваются? Если они разные, у них может возникнуть проблема, поскольку JSON технически для «raw_data» - это массив массивов. Вы могли бы реализовать собственный сериализатор для своего класса и поместить его во что угодно. –

+0

Оба двухместных номера должны отлично работать для меня. Я не мог найти пример того, как структурировать класс для массива массивов. Есть ли у вас какие-либо намеки на то, как я должен объявить свойство raw_data? – Alienfluid

+0

Конечно, я бы подумал, что double [] [] будет работать нормально, но я не пробовал. –

ответ

1

Если типы для raw_data оба двойники потом что-то вроде этого:

public class MyClass 
{ 
    public string title { get; set; } 
    public List<List<double>> raw_data { get; set; } 
} 

Прохладный веб-сайт вы можете проверить: http://json2csharp.com/

+0

Так оно и было. Благодарю. – Alienfluid

0

Извините, мой первоначальный ответ был бесполезным, вот лучший ответ.

Возможно, у вас возникли проблемы, потому что вы видели эти типы как целое и двойное значение (естественно для программиста на C#), однако Json ничего не знает об этих типах и представляет числа просто как десятичные числа.

Как уже сказал другой ответ, вы можете просто deserialize как список списков парных. Интересно, что есть возможность конвертировать его в более естественное представление.

Однако я не рекомендую это, поскольку он не является точно типичным при десериализации (тип исходного элемента теряется при преобразовании в десятичный, вы можете только предполагать, что этот способ будет работать)!

public class BarArrayConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     // Not properly implemented! 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     List<Bar> bars = new List<Bar>(); 

     // Read the first token after the start array 
     reader.Read(); 

     // Parse elements of the array 
     while (reader.TokenType == JsonToken.StartArray) 
     { 
      Bar b = new Bar(); 

      // Convert these as necessary to your internal structure. Note that they are nullable types. 
      b.First = reader.ReadAsDecimal(); 
      b.Second = reader.ReadAsDecimal(); 


      // Read end array for this element 
      reader.Read(); 
      // Pull off next array in list, or end of list 
      reader.Read(); 

      bars.Add(b); 
     } 

     return bars; 
    } 

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


class Bar 
{ 
    public decimal? First; 
    public decimal? Second; 
} 

class Foo 
{ 
    [JsonProperty("title")] 
    public string Title { get; set; } 

    [JsonConverter(typeof(BarArrayConverter))] 
    [JsonProperty("raw_data")] 
    public List<Bar> RawData { get; set; } 
} 

Практически разумно использовать десятичные типы. Единственная причина, по которой я могу это сделать, - это требование о том, чтобы оставить первое значение как целое число, это будет способом ограничения значения переменной более естественным образом.

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