Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用嵌套对象键生成JSON_C#_Json.net - Fatal编程技术网

C# 使用嵌套对象键生成JSON

C# 使用嵌套对象键生成JSON,c#,json.net,C#,Json.net,我试图从一些数据库记录中生成C#(.NETCore)中的JSON字符串 数据模式是扁平的,包含类别(字符串)、图书Id(整数)和图书名称(字符串) 数据行如下所示: Category BookId BookName --------------------------------------- Mystery 1 My first book Biography 2 My second book Mystery 3 M

我试图从一些数据库记录中生成C#(.NETCore)中的JSON字符串

数据模式是扁平的,包含类别(字符串)、图书Id(整数)和图书名称(字符串)

数据行如下所示:

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查询,以获取C#
列表
集合中的记录(最多5000条):

SELECT Category, BookId, BookName from Books
我想生成一个JSON字符串(最好使用Newtonsoft JSON.Net库),其中图书按类别分组,并包括类别和图书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"
    }
  }
  :
  :
}
我尝试了
字典
查找
(可能比字典更好,因为哈希操作的开销更小),但我无法让它们生成我所追求的格式,主要用于JS对象中基于键的直接访问


对于性能方法的任何建议,我们将不胜感激。

尝试将您的收藏转换为嵌套词典:

// 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);

我将创建一个表示您想要的JSON的模型(DTO),将您的数据库结果映射到该模型,然后对该模型进行序列化。请共享您使用
字典和
查找所尝试的代码。顺便说一句,您需要在一个json对象中保存所有内容还是应该是一个数组?谢谢,这很有效。但字典很重,特别是对于成千上万的嵌套字典。如果您有任何提高性能或替代方法的建议,我将不胜感激。如果性能不够好,您可以尝试通过
JObject
在那里编写分组结果。但我建议你先对它进行基准测试。运行一些基准测试。原来
ToDictionary
的创建速度至少是循环
JObject
创建速度的两倍。