問題描述
C# |.NET 4.5 |實(shí)體框架 5
我有從 SQL 查詢返回的 ID、ParentID、Name 形式的數(shù)據(jù).我想獲取該數(shù)據(jù)并將其解析為分層 JSON 字符串.到目前為止,這似乎是一項(xiàng)比應(yīng)有的艱巨任務(wù).由于我使用的是實(shí)體,因此數(shù)據(jù)作為 IEnumerable 很好地返回給我.現(xiàn)在我相信我只需要某種形式的遞歸,但我不太確定從哪里開始.任何幫助表示贊賞.
數(shù)據(jù)返回為
<上一頁>id parentId 名稱1 1 頂部位置2 1 位置 13 1 位置 24 2 位置1A代碼是
public static string GetJsonLocationHierarchy(long locationID){使用(實(shí)體設(shè)置上下文 = 新實(shí)體設(shè)置()){//ID,ParentID,Name 的 IEnumerablecontext.GetLocationHierarchy(locationID);}}
我希望的最終結(jié)果是這樣的:
<代碼>{id":1",父ID":1","名稱": "TopLoc",孩子們": [{id":2",父ID":1",名稱":Loc1",孩子們": [{id":4",parentId":2",名稱":Loc1A",孩子們": [{}]}]},{id":3",父ID":1",名稱":Loc2",孩子們": [{}]}]}
將平面表轉(zhuǎn)換為層次結(jié)構(gòu)的一種方法是將所有節(jié)點(diǎn)放入字典中.然后遍歷字典,并為每個節(jié)點(diǎn)查找其父節(jié)點(diǎn)并將其添加到父節(jié)點(diǎn)的子節(jié)點(diǎn).從那里,您只需要找到根并對其進(jìn)行序列化.
這是一個演示該方法的示例程序:
類程序{靜態(tài)無效主要(字符串 [] 參數(shù)){IEnumerable<Location>位置=新列表<位置>{新位置 { Id = 1,ParentId = 1,名稱 =TopLoc"},新位置 { Id = 2,ParentId = 1,名稱 =Loc1"},新位置 { Id = 3, ParentId = 1, Name = "Loc2" },新位置 { Id = 4, ParentId = 2, Name = "Loc1A" },};字典<int,位置>dict = locations.ToDictionary(loc => loc.Id);foreach(dict.Values 中的位置 loc){if (loc.ParentId != loc.Id){位置父 = dict[loc.ParentId];父.子.Add(loc);}}位置根 = dict.Values.First(loc => loc.ParentId == loc.Id);JsonSerializerSettings 設(shè)置 = 新的 JsonSerializerSettings{ContractResolver = new CamelCasePropertyNamesContractResolver(),格式 = 格式.縮進(jìn)};字符串 json = JsonConvert.SerializeObject(root, 設(shè)置);Console.WriteLine(json);}}上課地點(diǎn){公共位置(){孩子 = 新列表<位置>();}公共 int ID { 獲取;放;}公共 int ParentId { 獲取;放;}公共字符串名稱 { 獲取;放;}公共列表<位置>孩子{得到;放;}}
這是輸出:
<代碼>{身份證":1,父ID":1,"名稱": "TopLoc",孩子們": [{身份證":2,父ID":1,名稱":Loc1",孩子們": [{身份證":4,父ID":2,名稱":Loc1A",孩子們": []}]},{身份證":3,父ID":1,名稱":Loc2",孩子們": []}]}
C# | .NET 4.5 | Entity Framework 5
I have data coming back from a SQL Query in the form of ID,ParentID,Name. I'd like to take that data and parse it into a Hierarchical JSON string. So far it seems to be much more of a daunting task than it should be. Since I'm using Entity the data comes back nicely to me as an IEnumerable. Now I believe I just need some form of recursion, but I'm not quite sure where to start. Any help is appreciated.
Data Returns as
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);
}
}
The end result I'd hope would be something like this:
{
"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": [
{}
]
}
]
}
One way to turn a flat table into a hierarchy is to put all your nodes into a dictionary. Then iterate over the dictionary, and for each node, look up its parent and add it to the parent's children. From there, you just need to find the root and serialize it.
Here is an example program to demonstrate the approach:
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; }
}
Here is the output:
{
"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": []
}
]
}
這篇關(guān)于從結(jié)構(gòu)化數(shù)據(jù)構(gòu)建 JSON 層次結(jié)構(gòu)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!