c# - 添加无限次嵌套代码

标签 c# json.net nested-loops

我有一个独特的问题。我的程序从 Chrome 的书签 JSON 文件获取书签。我为此使用 JSON.net dll。我的问题是,我需要将每个 URL 放入其正确的文件夹层次结构中,但是,似乎您可以创建无限数量的文件夹来保存书签。以下是 JSON 层次结构的示例:

{
   "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 语句复制/粘贴到我所说的“等等”中。等等?

谢谢!

编辑:这是类 o:

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

最佳答案

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

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

关于c# - 添加无限次嵌套代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251773/

相关文章:

c# - 尝试使用 JSON.NET 反序列化带有周围 [] 字符的 JSON

python - 修改嵌套字典中的键和值,其中包含列表

c# - backgroundWorker 和 progressChanged 不工作

c# - 将具有基本类型的列表序列化为派生类型 json

C#字符串转句子

c# - 没有数组名称的XML到Json c#

c# - 解析 JSON 轮负值

javascript - 对两个关联数组/堆栈进行排序

python - 在python中自动嵌套for循环

c# - 表单设计器打破了通用抽象 UserControl