从结构化数据构建JSON层次结构

C#| .NET 4.5 | entity framework5

我有一个以ID,ParentID,Nameforms从SQL查询返回的数据。 我想获取该数据并将其解析为Hierarchical JSON字符串。 到目前为止,这似乎是一项艰巨的任务,而不是应有的任务。 因为我正在使用Entity,所以数据作为IEnumerable很好地回馈给我。 现在我相信我只需要某种forms的递归,但我不确定从哪里开始。 任何帮助表示赞赏。

数据返回为

 id parentId name 1 1 TopLoc 2 1 Loc1 3 1 Loc2 4 2 Loc1A 

代码是

public static string GetJsonLocationHierarchy(long locationID) { using (EntitiesSettings context = new EntitiesSettings()) { // IEnumerable of ID,ParentID,Name context.GetLocationHierarchy(locationID); } } 

最终的结果我希望是这样的:

 { "id": "1", "parentId": "1", "name": "TopLoc", "children": [ { "id": "2", "parentId": "1", "name": "Loc1", "children": [ { "id": "4", "parentId": "2", "name": "Loc1A", "children": [ {} ] } ] }, { "id": "3", "parentId": "1", "name": "Loc2", "children": [ {} ] } ] } 

将平面表转换为层次结构的一种方法是将所有节点放入字典中。 然后迭代字典,并为每个节点查找其父节点并将其添加到父节点的子节点。 从那里,你只需要找到根并序列化它。

以下是演示该方法的示例程序:

 class Program { static void Main(string[] args) { IEnumerable locations = new List { new Location { Id = 1, ParentId = 1, Name = "TopLoc" }, new Location { Id = 2, ParentId = 1, Name = "Loc1" }, new Location { Id = 3, ParentId = 1, Name = "Loc2" }, new Location { Id = 4, ParentId = 2, Name = "Loc1A" }, }; Dictionary dict = locations.ToDictionary(loc => loc.Id); foreach (Location loc in dict.Values) { if (loc.ParentId != loc.Id) { Location parent = dict[loc.ParentId]; parent.Children.Add(loc); } } Location root = dict.Values.First(loc => loc.ParentId == loc.Id); JsonSerializerSettings settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Formatting = Formatting.Indented }; string json = JsonConvert.SerializeObject(root, settings); Console.WriteLine(json); } } class Location { public Location() { Children = new List(); } public int Id { get; set; } public int ParentId { get; set; } public string Name { get; set; } public List Children { get; set; } } 

这是输出:

 { "id": 1, "parentId": 1, "name": "TopLoc", "children": [ { "id": 2, "parentId": 1, "name": "Loc1", "children": [ { "id": 4, "parentId": 2, "name": "Loc1A", "children": [] } ] }, { "id": 3, "parentId": 1, "name": "Loc2", "children": [] } ] } 

我在javascript中尝试过类似的东西。

 list = [ { id: 1, title: 'home', parent: null }, { id: 2, title: 'about', parent: null }, { id: 3, title: 'team', parent: 2 }, { id: 4, title: 'company', parent: 2 } ] function treeify(list, idAttr, parentAttr, childrenAttr) { if (!idAttr) idAttr = 'id'; if (!parentAttr) parentAttr = 'parent'; if (!childrenAttr) childrenAttr = 'children'; var treeList = []; var lookup = {}; list.forEach(function(obj) { lookup[obj[idAttr]] = obj; obj[childrenAttr] = []; }); list.forEach(function(obj) { if (obj[parentAttr] != null) { lookup[obj[parentAttr]][childrenAttr].push(obj); } else { treeList.push(obj); } }); return treeList; }; console.log(JSON.stringify(treeify(list)));