使用LINQ分组扁平数据构建层级树以生成符合要求的JSON结构
解决方案
核心问题
你原有的LINQ查询生成了嵌套数组结构,且没有按期望的层级包装属性,导致站点重复、结构不符合要求。
修改方法
替换原inventorycontent相关的查询和序列化逻辑即可,调整后的查询会严格按你需要的层级分组包装对象:
void Main() { var contents = new List<DatabaseRecord>() { new DatabaseRecord{Product="Autoblaster", Inventory="Hull 5", Site="Death star", Units=20,Weight=500}, new DatabaseRecord{Product="E11 Blaster Rifle", Inventory="Hull 5", Site="Death star", Units=512,Weight=4096}, new DatabaseRecord{Product="SWE/2 Sonic Rifle", Inventory="Hull 1", Site="Death star", Units=20,Weight=500}, new DatabaseRecord{Product="Relby v10 Micro Grenade Launcher", Inventory="Hull 5", Site="Death star", Units=20,Weight=500}, new DatabaseRecord{Product="T-8 Disruptor", Inventory="Hull 1", Site="Death star", Units=20,Weight=500}, new DatabaseRecord{Product="E11 Blaster Rifle", Inventory="Hull 2", Site="Death star", Units=50,Weight=1200} }; // 修改后的层级查询 var resultRoot = new { sites = contents .GroupBy(row => row.Site) .OrderBy(siteGroup => siteGroup.Key) .Select(siteGroup => new { site = siteGroup.Key, inventories = siteGroup .GroupBy(invRow => invRow.Inventory) .OrderBy(invGroup => invGroup.Key) .Select(invGroup => new { name = invGroup.Key, lines = invGroup.Select(p => new { p.Product, p.Weight, p.Units }).ToList() }).ToList() }).ToList() }; contents.Dump(); resultRoot.Dump(); JsonConvert.SerializeObject(resultRoot, Newtonsoft.Json.Formatting.Indented).Dump(); } // 其他方法和类定义 class DatabaseRecord { public string Product { get; set; } public string Inventory { get; set; } public string Site { get; set; } public int Units { get; set; } public double Weight { get; set; } }
修改说明
- 新增最外层匿名对象包含
sites属性,匹配你需要的根结构 - 站点分组后直接包装为带
site和inventories属性的对象,站点名仅在这一层出现,自动去重 - 每个站点下的库存分组包装为带
name和lines属性的对象,和期望的字段命名完全对齐
调整后序列化输出的JSON会完全符合你给出的预期格式。
内容的提问来源于stack exchange,提问作者GeirR
相关产品推荐
相关产品推荐

