将ArrayList转换为Desired Json格式

时间:2016-11-03 16:05:36

标签: javascript c# json

我们有结果集,它以包含父,子和更多列的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

等等,这不是预期的数据。

更新了问题,以便获得答案可能会有所帮助

先谢谢。

2 个答案:

答案 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));
        }



}

感谢您的建议/帮助。