Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无限次添加嵌套代码_C#_Json.net_Nested Loops - Fatal编程技术网

C# 无限次添加嵌套代码

C# 无限次添加嵌套代码,c#,json.net,nested-loops,C#,Json.net,Nested Loops,我有一个独特的问题。我的程序正在从chrome浏览器、书签JSON文件中获取书签。我正在为此使用JSON.net dll。我的问题是,我需要得到每个URL在其正确的文件夹层次结构,然而,似乎你可以创建一个无限量的文件夹来保存书签。以下是JSON hiarchy的一个示例: { "checksum": "c9e24e7fb3c6cb184fb776e32dd1004e", "roots": { "bookmark_bar": { "children": [

我有一个独特的问题。我的程序正在从chrome浏览器、书签JSON文件中获取书签。我正在为此使用JSON.net dll。我的问题是,我需要得到每个URL在其正确的文件夹层次结构,然而,似乎你可以创建一个无限量的文件夹来保存书签。以下是JSON hiarchy的一个示例:

{
   "checksum": "c9e24e7fb3c6cb184fb776e32dd1004e",
   "roots": {
      "bookmark_bar": {
         "children": [ {
{
"children": [ {
   "children": [ {
      "children": [ {
         "children": [ {
            "date_added": "12985566069697953",
            "id": "225",
            "name": "EvasiveURL",
            "type": "url",
            "url": "evasiveurl.com"
         } ],
         "date_added": "12991165233108137",
         "date_modified": "12991165244676611",
         "id": "374",
         "name": "NestedFolder2",
         "type": "folder"
      } ],
      "date_added": "12991165215985934",
      "date_modified": "12991165215985934",
      "id": "373",
      "name": "NestedFolder",
      "type": "folder"
   } ],
   "date_added": "12985566069695953",
   "date_modified": "12991165219618934",
   "id": "204",
   "name": "Games",
   "type": "folder"
}
这是我目前的代码:

for (int i = 0; o["roots"]["bookmark_bar"]["children"][i] != o["roots"]["bookmark_bar"]["children"].Last; i++)
{
    var property = o["roots"]["bookmark_bar"]["children"][i]["url"];
    var property2 = o["roots"]["bookmark_bar"]["children"][i]["children"];
    Console.WriteLine(o["roots"]["bookmark_bar"]["children"][i]["type"]);
    if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "url") {
        Console.WriteLine("URL");
    }

    else if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "folder")
    {
        Console.WriteLine("FOLDER");
        for (int ii = 0; o["roots"]["bookmark_bar"]["children"][i]["children"][ii] != o["roots"]["bookmark_bar"]["children"][i]["children"].Last; ii++)
        {
            property = o["roots"]["bookmark_bar"]["children"][i]["children"][ii];
          //  Console.WriteLine(property);
            if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "url")
            {
                Console.WriteLine("URL");
            }

            else if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "folder")
            {
                for (int iii = 0; o["roots"]["bookmark_bar"]["children"][i]["children"][ii]["children"][iii] != o["roots"]["bookmark_bar"]["children"][i]["children"][ii]["children"].Last; iii++)
                {
                    if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "url")
                    {
                        Console.WriteLine("URL");
                    }
                    else if (o["roots"]["bookmark_bar"]["children"][i]["type"].ToString() == "folder")
                    {
                        //etc. etc.
                    }
                }
            }
        }
    }
}
那么,我如何重写这段代码,而不将前面的for循环和If-Else语句复制/粘贴到我说的“etc.etc”的地方呢

谢谢

编辑:这是o类:

JsonSerializer serializer = new JsonSerializer();
var o = (JToken)serializer.Deserialize(jsonReader);

这将是你问题的解决方案。正如我所说,您处理childs的递归

private void processJsonInput()
{
  var reader = new StreamReader(new FileStream("d:\\jsonfile.txt", FileMode.Open));

  JsonSerializer serializer = new JsonSerializer();
  var o = (JToken)serializer.Deserialize(new JsonTextReader(reader));

  foreach (var child in o["roots"]["bookmark_bar"]["children"])
  {
    processChild(child);
  }
}

private void processChild(JToken child)
{
  if (child["type"].ToString() == "url")
  {
    Console.WriteLine("URL");
  } 
  else if (child["type"].ToString() == "folder")
  {
    Console.WriteLine("FOLDER");
    // process sub childrens in the folder
    foreach (var subChild in child["children"])
    {
      processChild(subChild);
    }
  }
}

这些问题可以通过递归函数调用来解决