我们有结果集,它以包含父,子和更多列的List的形式返回。我们想将它转换为Json,父转换为Id和Child转换为相应的节点。 见下面的例子
返回结果:
parent | Child
ab | cd
ab | ef
ab | gh
cd | ij
cd | kl
ef | mn
ef | op
gh | qr
ij | st
and so on
期待Json:
{
"id": "ab",
"label": "ab",
"nodes": [
{
"id": "cd",
"label": "cd",
"nodes": [
{
"id": "ij",
"label": "ij",
"nodes": {
"id": "st",
"label": "st"
}
},
{
"id": "kl",
"label": "kl"
}
]
},
{
"id": "ef",
"label": "ef",
"nodes": [
{
"id": "mn",
"label": "mn"
},
{
"id": "op",
"label": "op"
}
]
},
{
"id": "gh",
"label": "gh",
"nodes": {
"id": "qr",
"label": "qr"
}
}
]
}
希望问题很明确,请让我知道C#或js实用程序,这有助于我这样做。
先谢谢
经过一些研究,
public class TreeNode
{
public TreeNode()
{
nodes = List<TreeNode>();
}
String id {get; set;}
List<TreeNode> nodes {get; set;}
}
方式
public List<TreeNode> FlatToHierarchy(List<TreeNode> list)
{
var lookup = new Dictionary<string, TreeNode>();
// actual nested collection to return
List<TreeNode> nested = new List<TreeNode>();
foreach (TreeNode item in list)
{
if (lookup.ContainsKey(item.Parent))
{
lookup[item.Parent].Children.Add(item);
}
else
{
nested.Add(item);
}
lookup.Add(item.Part, item);
}
return nested;
}
但是这会回来,
ab
|
--cd
|
--ij
--cd
|
--kl
ab
|
--ef
|
--mn
--ef
|
--op
等等,这不是预期的数据。
更新了问题,以便获得答案可能会有所帮助。
先谢谢。
答案 0 :(得分:1)
请使用JSON.Net或其他json解析器。
答案 1 :(得分:0)
最后,我们可以编写一些代码,它对我们有用。
public List<TreeNode> FillRecursive(List<T> eqpList)
{
List<TreeNode> list = new List<TreeNode>();
//First Item in the list is our RootNode
var FirstEqp = eqpList.FirstOrDefault();
TreeNode RootNode = new TreeNode();
RootNode.text = FirstEqp.Parent;
RootNode.items.Add(new TreeNode() { text = FirstEqp.child });
foreach (EquipmentHierarchySPList eqp in eqpList)
{
GetTreeStructureFromList(eqp, list, RootNode);
}
return list;
}
public void GetTreeStructureFromList(T eqp, List<TreeNode> list,TreeNode RootNode)
{
bool found = false;
TreeNode FoundNode = GetTreeNode((list.Count != 0 ? RootNode : null), eqp.Parent, out found);
if (!FoundNode.IsNullValue())
FoundNode.items.Add(new TreeNode() { text = eqp.child });
else //this will execute only once.
list.Add(RootNode);
}
public TreeNode GetTreeNode(TreeNode RootNode, string findText,out bool found)
{
//if RootNode is Null , just return;
if (RootNode.IsNullValue())
{
found = false;
return null;
}
if (RootNode.text.Equals(findText))
{
found = true;
return RootNode;
}
for (int j = 0; ; j++)
{
if (j >= RootNode.items.Count)
{
found = false;
return RootNode;
}
var final = GetTreeNode(RootNode.items[j], findText,out found);
if (found == true)
return final;
if (final.IsNullValue())
return RootNode;
}
}
}
public class TreeNode
{
public TreeNode()
{
items = new List<TreeNode>();
}
public string text { get; set; }
public List<TreeNode> items { get; set; }
public bool TreeCompare(string findText)
{
return Convert.ToBoolean(text.CompareTo(findText));
}
}
感谢您的建议/帮助。