C#| .NET 4.5 | Entity Framework 5
我有一个ID,ParentID,Name形式的SQL查询返回的数据。我想获取该数据并将其解析为Hierarchical JSON字符串。到目前为止,这似乎比应做的任务艰巨得多。由于我使用的是Entity,因此数据作为IEnumerable可以很好地返回给我。现在,我相信我只需要某种形式的递归,但是我不确定从哪里开始。任何帮助表示赞赏。
数据返回为
id parentId name 1 1 TopLoc 2 1 Loc1 3 1 Loc2 4 2 Loc1A
Code is
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<Location> locations = new List<Location>
{
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<int, Location> 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<Location>();
}
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public List<Location> 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": []
}
]
}
关于c# - 从结构化数据构建JSON层次结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19256579/