Wil*_*ill 9 c# json entity-framework hierarchy json.net
C#| .NET 4.5 | 实体框架5
我有一个以ID,ParentID,Name形式从SQL查询返回的数据.我想获取该数据并将其解析为Hierarchical JSON字符串.到目前为止,它似乎更应该是一项艰巨的任务.因为我正在使用Entity,所以数据作为IEnumerable很好地回馈给我.现在我相信我只需要某种形式的递归,但我不太清楚从哪里开始.任何帮助表示赞赏.
数据返回为
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);
}
}
Run Code Online (Sandbox Code Playgroud)
最终结果我希望是这样的:
{
"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": [
{}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*ers 12
将平面表转换为层次结构的一种方法是将所有节点放入字典中.然后迭代字典,并为每个节点查找其父节点并将其添加到父节点的子节点.从那里,你只需要找到根并序列化它.
以下是演示该方法的示例程序:
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; }
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
{
"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": []
}
]
}
Run Code Online (Sandbox Code Playgroud)