c#无法使用newtonsoft正确构建json层次结构

时间:2017-03-10 03:23:40

标签: c# json json.net

我看了这个问题,但它并没有解决我的需求:Build JSON Hierarchy from Structured Data

问题:在尝试构建json时,孩子的嵌套并没有正确完成。 children属性应包含一个或多个name数组项,如下所示:

  "children": [{
    "name": "XXX - Level XXX",

...而是生成为:

  "children": []

这里有一个dotnet fiddle,其中包含更多代码详细信息:

我试图通过使用json.net .Last来抓住最后一个孩子,然后为那个孩子添加JObject来尝试构建树,但这也没有成功对我好。

用于构建json的主要数据结构:

  Dictionary<int, Industry>();

所需的json结构应为:

  {
    "name": "XX Level XX",
    "children": [{
        "name": "XXX - Level XXX",
        "children": [{
            "name": "XXXX - Level XXXX",
            "children": [{
                "name": "XXXXX - Level XXXXX",
                "children": [{
                    "name": "XXXXXX - Level XXXXXX"
                 }]
            }]
        }]
     }]
 }

实际输出是:

  {
    "name": "XX-Level XX",
    "children": [{
                 "name": "XXX-Level XXX",
                 "children": []
                 }, {
                 "name": "XXXX-Level XXXX",
                 "children": []
                 }, {
                 "name": "XXXXX-Level XXXXX",
                 "children": []
                 }, {
                 "name": "XXXXXX-Level XXXXXX",
                  "children": []
                 }
               ]
     }     

这里是构建json的代码:

    dynamic relationship = new JObject();
    relationship.name = relationships[0].Industries[1].Name;
    relationship.children = new JArray();

    var lftIndustries = relationships[0].Industries.Where(k => k.Key > 1);

    foreach (var item in lftIndustries)
    {
            //not good enough, need to get deepest, empty "children" node
            // and add "industry" to it
            var node = ((JContainer)relationship).Last;
            var childArray = (JArray)((JContainer) node).Last;

            var industry = new JObject(new JProperty("name", item.Value.Name), new JProperty("children", new JArray()));

            childArray.Add(industry);
    }

    json = relationship.ToString(); 

我认为使用json.net .Last.Next就是答案。

1 个答案:

答案 0 :(得分:0)

在你的foreach循环中尝试这个,并告诉我你是否正在寻找:

JToken currentContainer = null;
foreach (var item in lftIndustries)
        {

                //not good enough, need to get deepest, empty "children" node
                // and add "industry" to it
            if (currentContainer != null)
            {
                var node = ((JContainer)currentContainer).Last;
                var childArray = (JArray)((JContainer) node).Last;

                var industry = new JObject(new JProperty("name", item.Value.Name), new JProperty("children", new JArray()));

                childArray.Add(industry);
                currentContainer = industry;
            }
            else
            {
                var node = ((JContainer)relationship).Last;
                var childArray = (JArray)((JContainer) node).Last;

                var industry = new JObject(new JProperty("name", item.Value.Name), new JProperty("children", new JArray()));

                childArray.Add(industry);
                currentContainer = industry;
            }


        }

结果如下:

{
  "name": "XX-Level XX",
  "children": [
    {
      "name": "XXX-Level XXX",
      "children": [
        {
          "name": "XXXX-Level XXXX",
          "children": [
            {
              "name": "XXXXX-Level XXXXX",
              "children": [
                {
                  "name": "XXXXXX-Level XXXXXX",
                  "children": []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

继承人:https://dotnetfiddle.net/1yzTGU