Создание вложенного JSON с данными из SQLDataReader - PullRequest
1 голос
/ 17 октября 2019

Я новичок в .NET и пытаюсь добиться того, что shape-json делает в мире узлов.

Скопировано со страницы shape-json npm:

Учитывая следующий массив объектов:

var input = [
  {pid: 1, contributor: 'jdalton', projectID: 1, projectName: 'lodash'},
  {pid: 1, contributor: 'jdalton', projectID: 2, projectName: 'docdown'},
  {pid: 1, contributor: 'jdalton', projectID: 3, projectName: 'lodash-cli'},
  {pid: 2, contributor: 'contra',  projectID: 4, projectName: 'gulp'},
  {pid: 3, contributor: 'phated',  projectID: 4, projectName: 'gulp'},
]

Вы можете применить схему, подобную этой:

var scheme = {
  "$group[contributors](pid)": {
    "id": "pid",
    "name": "contributor",
    "$group[projects](projectID)": {
      "id": "projectID",
      "name": "projectName"
    }
  }
};

Чтобы получить вложенный JSON, подобный этому:

{
  "contributors": [
    {
      "id": 1,
      "name": "jdalton",
      "projects": [
        {
          "id": 1,
          "name": "lodash"
        },
        {
          "id": 2,
          "name": "docdown"
        },
        {
          "id": 3,
          "name": "lodash-cli"
        }
      ]
    },
    {
      "id": 2,
      "name": "contra",
      "projects": [
        {
          "id": 4,
          "name": "gulp"
        }
      ]
    },
    {
      "id": 3,
      "name": "phated",
      "projects": [
        {
          "id": 4,
          "name": "gulp"
        }
      ]
    }
  ]
}

В моем случае у меня есть иерархия продуктов (класс продукта -> подкласс продукта -> продукт), которую я пытаюсь представить как вложенный JSON.

Справочная информация:

  • Я получаю данные из таблицы MySQL и считываю их в MySqlDataReader.

  • После этого ТАКого вопроса я смог сериализовать данные в JSON

Я не знаю, как создать вложенный JSONкак в примере выше. Пожалуйста, порекомендуйте.

1 Ответ

3 голосов
/ 18 октября 2019

MySqlDataReader реализует интерфейс IDataReader, поэтому мы можем использовать LINQ лямбда-выражение для итерации по его строками преобразовать их в соответствующую модель данных .Net. Затем впоследствии модель данных можно сериализовать в JSON с помощью .

Сначала возьмите следующий метод расширения из этого ответа с помощью Джоэл Коухорн :

public static class DataReaderExtensions
{
    // Adapted from this answer https://stackoverflow.com/a/1202973
    // To /863766/konvertirovat-stroki-iz-schityvatelya-dannyh-v-tipizirovannye-rezultaty
    // By https://stackoverflow.com/users/3043/joel-coehoorn
    public static IEnumerable<T> SelectRows<T>(this IDataReader reader, Func<IDataRecord, T> select)
    {
        while (reader.Read())
        {
            yield return select(reader);
        }
    }
}

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

using (IDataReader reader = cmd.ExecuteReader())
{
    var query = reader
        .SelectRows(r => 
                    new
                    {
                        id = r.GetInt64(r.GetOrdinal("pid")),
                        name = r["contributor"].ToString(),
                        project = new {id = r.GetInt64(r.GetOrdinal("projectID")), name = r["projectName"].ToString() },
                    }
                   )
        .GroupBy(r => new { r.id, r.name })
        .Select(g => new { g.Key.id, g.Key.name, projects = g.Select(i => i.project) });

    var json = JsonConvert.SerializeObject(new { contributors = query }, Formatting.Indented);

    Console.WriteLine(json);
}

Примечания:

  • Я конвертируюстроки считывателя данных в модели данных, состоящие из объектов анонимного типа , но вы можете использовать объекты с явным типом для получения конечных результатов, если хотите.

  • GroupBy используется для группировки всех вкладов по идентификатору и имени участника.

  • Select используется для проецирования элементов перечислимого в новыйform.

  • Этот подход полностью пропускает промежуточные этапы сериализации необработанных результатов запроса в JSON с последующим анализом и реструктуризацией этого исходного JSON.

  • Сам по себе query ленив, поэтому обязательно оцените его, прежде чем избавляться от данных. читательВ приведенном выше коде Json.NET фактически выполняет оценку во время сериализации, при вызове JsonConvert.SerializeObject.

  • Я не был уверен, были ли столбцы id 32-разрядными или64-разрядные целые числа, поэтому я предположил, что для безопасности они больше.

  • Код предполагает, что ни одно из значений записи не равно null .

Демонстрационная скрипка здесь , которая макетирует вышеперечисленное, используя DataTable и DataTableReader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...