解析Json;将数据写入TreeView分支



我有一个很大的json文件,其中的数据排列如下:

  • id-项目id
  • -父id
  • 名称-名称

    {id:"2859",父母:"5853",名称:"莫斯科"},…

我需要把它放到TreeView中。请帮忙=(

现在我是这样做的:

RootObject data = JsonConvert.DeserializeObject<RootObject>(content);
foreach (var _data in data.data)
{
bool find = false;
foreach(TreeNode n in Regions.Nodes)
{
if (n.Name == _data.parent)
{
bool find2 = false;
n.Nodes.Add(_data.id, _data.name);
find = true;
}
}
if (find != true)
{
Regions.Nodes.Add(_data.id, _data.name);
}
}

Json文件

您的代码不能正常工作有两个原因:

  1. 您假设如果一个项有一个父项,那么该父项将在数据中位于第一位,因此当您试图找到它时,它将被添加到树中。然而,这并不成立。如果您遵循数据中的id链,则在某些情况下,父项出现在子项之后
  2. 不处理项的父级不在根级别的情况。如果某个项的父项以前是作为根级节点的子项添加到树中的,则在根节点列表中找不到该项,因此您最终会将该项添加到根而不是正确的父项

您需要做的是使用字典查找分两次处理数据:

首先,从数据中创建所有单独的TreeNodes,并将它们添加到字典中,按ID键控。
然后,第二次迭代数据,对于每个项,使用各自的ID在字典中查找相应的节点及其父节点。如果找到父节点,则将该节点添加到父节点的节点列表中,否则将其添加到根节点列表中。

以下是它在代码中的样子:

void PopulateTreeViewFromJson(TreeView treeView, string json)
{
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
var dict = root.data.ToDictionary(n => n.id, 
n => new TreeNode(n.name.Trim()) { Name = n.id });
foreach (var item in root.data)
{
TreeNode node = dict[item.id];
TreeNode parentNode;
if (dict.TryGetValue(item.parent, out parentNode))
{
parentNode.Nodes.Add(node);
}
else
{
treeView.Nodes.Add(node);
}
}
}

最新更新