2010-10-27 4 views
1

У меня есть 2-мерный массив значений в формате JSON:десериализации JSON 2-мерный массив значений

[[57, 2], [57, 2], [58, 2], [55, 2], [60, 2], [54, 1], [59, 11]] 

Каждая из пар действительно содержит пару несвязанных чтений, и есть одна пара за каждую минуту. Таким образом, в первый мин, чтение 1 составляет 57, а чтение 2 - 2. На второй минуте показания те же и т. Д.

Теперь я хочу преобразовать это в формат, который я могу использовать в .Net для построения каждого из этих показаний. Это может быть либо два параллельных массива, один для показаний первого значения с одним элементом за каждую минуту, и один массив для всех показаний второго значения. Или это может быть двумерный массив, если это проще.

Я попытался с помощью DataContractJSONSerializer без везения:

IEnumerable<SubmissionDataRow> obj = (IEnumerable<SubmissionDataRow>)ser.ReadObject(reader, false); 

где SubmissionDataRow просто класс со свойством для каждого из показаний, но десериализатор не будет знать, какое значение ставить, в собственности!

ответ

0

В мои .NET-дни я использовал Jayrock, и он работал как шарм.

0

Вы можете сделать это несколькими способами, используя Json.Net. Если вы не против работать с двумерным массивом чисел, вы можете просто десериализации в int[][]:

string json = "[[57, 2], [57, 2], [58, 2], [55, 2], [60, 2], [54, 1], [59, 11]]"; 

int[][] values = JsonConvert.DeserializeObject<int[][]>(json); 

Если вы предпочитаете работать с сильно типизированных класса, как вы упомянули в своем вопросе, вы можете использовать JsonConverter для его заполнения.

Определите класс, как это:

[JsonConverter(typeof(SubmissionDataRowConverter))] 
class SubmissionDataRow 
{ 
    public int Reading1 { get; set; } 
    public int Reading2 { get; set; } 
} 

И преобразователь так:

class SubmissionDataRowConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return (objectType == typeof(SubmissionDataRow)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JArray array = JArray.Load(reader); 
     return new SubmissionDataRow 
     { 
      Reading1 = array[0].Value<int>(), 
      Reading2 = array[1].Value<int>() 
     }; 
    } 

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

Тогда вы можете десериализации, как это:

List<SubmissionDataRow> rows = 
      JsonConvert.DeserializeObject<List<SubmissionDataRow>>(json); 
Смежные вопросы