Сгенерировать JSON с ключами вложенных объектов - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь сгенерировать строку JSON в C# (. Net Core) из некоторых записей базы данных.

Схема данных плоская с категорией (строкой), идентификатором книги (целое число ) и название книги (строка).

Строки данных выглядят так:

Category    BookId    BookName
---------------------------------------
Mystery     1         My first book
Biography   2         My second book
Mystery     3         My third book
Crime       4         My fourth book
Romance     5         My fifth book
Biography   6         My sixth book
Mystery     7         My seventh book
Romance     8         My eight book
SciFi       9         My ninth book
Poetry      10        My tenth book

Я выполняю простой запрос SQL для извлечения записей (до 5000) в C# List коллекция:

SELECT Category, BookId, BookName from Books

Я хочу сгенерировать строку JSON (желательно с использованием библиотеки Newtonsoft Json. Net) с книгами, сгруппированными по категориям, включая категорию и book-id в качестве ключей вложенных объектов:

{
  "Mystery": {
    "1": {
      "Name": "My first book"
    },
    "3": {
      "Name": "My third book"
    },
    "7": {
      "Name": "My seventh book"
    }
  },
  "Biography": {
    "2": {
      "Name": "My second book"
    },
    "6": {
      "Name": "My sixth book"
    }
  },
  "Crime": {
    "4": {
      "Name": "My fourth book"
    }
  }
  :
  :
}

Я пробовал Dictionary и Lookup (возможно, лучше, чем Dictionary из-за меньших накладных расходов с операциями ha sh), но я могу ' Я хочу заставить их сгенерировать формат, который мне нужен, в основном для прямого доступа на основе ключей в объекте JS.

Любые предложения по высокопроизводительному подходу приветствуются.

1 Ответ

1 голос
/ 25 мая 2020

Попробуйте преобразовать вашу коллекцию во вложенные словари:

// use yor actual type here
var collection = new[] 
{
    new {Category = "Mystery", BookId = 1 , BookName = "My first book"},
    new {Category = "Mystery", BookId = 2 , BookName = "My second book"}
};

var res = collection
    .GroupBy(arg => arg.Category)
    .ToDictionary(g => g.Key, g => g.ToDictionary(b => b.BookId, b => b.BookName));
JsonConvert.SerializeObject(res, Newtonsoft.Json.Formatting.Indented);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...