2

固有の問題があります。私のプログラムは、Chrome の Bookmarks 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 ステートメントを「etc. 等'?

ありがとう!

編集:これはクラスoです:

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

1 に答える 1

5

これはあなたの問題の解決策になります。私が言ったように、あなたは子を再帰的に処理します。

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);
    }
  }
}
于 2012-09-03T17:42:59.420 に答える