Десериализация JSON с массивами в C#

147
26 января 2020, 10:30

JSON файл содержит поле и три массива. Первые 2 массива описывают данные, последний массив содержит массивы с данными, каждый массив это один тип данных описанный в предыдущем массиве. Пример:

{
            "head": "111",
            "original": [
                "1",
                "4",
                "5",
            ],
            "fields": [
                "Rid",
                "Guid",
                "Options",
            ],
            "values": [
                [
                    6,
                    0,
                    1,
                [
                    "{0047B3AB-08B9-1D40-052C-D85868CC4F33}",
                    "{15DB501E-DBBD-EB79-0E64-225FDBEA848E}",
                    "{137555FA-DDDF-7AC3-9E61-AD1E0A5402EA}",
                ],
                [
                    0,
                    0,
                    11,
                ],
            ]
        }

Если запарсить мой пример используя объект:

public class Shtable
{
    public string head { get; set; }
    public string[] original { get; set; }
    public string[] fields { get; set; }
    public object[][] values { get; set; }
}

То можно разобрать массивы следующий кодом:

for (int x = 0; x < Shtable.Count(); x++)
{
     Value value= new Value 
     {
          Rid = (long)values[0][x], // 6
          Guid = (string)values[1][x], // "{0047B3AB-08B9-1D40-052C-D85868CC4F33}"
          Options = (long)values[2][x] // 0
     }
}

Проблема в том что количество полей не 3, а 69. Хочется избежать использования циклов.

Answer 1

Разбирается такой JSON весьма не сложно. Первый 2 массива содержат наименование полей данных, создаем из одного из них справочник индексов(в примере я взял original):

Dictionary<string, int> dict = new Dictionary<string, int>();
for (int x = 0; x < original.Length; x++) dict.Add(original[x], x);

И уже потом заходим в цикл и выбираем поля по их идентификаторам из массива original

for (int x = 0; x < Shtable.Count(); x++)
{
     Value value= new Value 
     {
          Rid = (long)values[dict["1"]][x], // 6
          Guid = (string)values[dict["4"]][x], // "{0047B3AB-08B9-1D40-052C-D85868CC4F33}"
          Options = (long)values[dict["5"]][x] // 0
     }
}
READ ALSO
Как создать аналог event listener на php?

Как создать аналог event listener на php?

Нужен метод который будет отслеживать изменения в свойствах другого классаПодскажите, пожалуйста, как можно это реализовать или где об этом...

137
Регулярные выражения php preg_match

Регулярные выражения php preg_match

Пытаюсь достать из переменной $result_text ГОСТы, когда в переменной храню короткую строку в которую включён какой нибудь ГОСТ, preg_match_all находитИ...

187
Вывести 3 рандомных числа из массива

Вывести 3 рандомных числа из массива

У меня есть две таблицыВ одной таблице id пользователей, в другой id пользователей, которых функция рандома не должна вызвать

161
Вывод на экран русских символов php

Вывод на экран русских символов php

День добрый! Не могу понять почему при выводе на экран всей строки отображается как должно, а при переборе �? Подскажите в чем дело

174