0

通常、適切な JSON オブジェクトには名前と値のペアがあり、複数のアイテムがある場合は値が JSON 配列になるようです。その方が解析しやすいです。

しかし、厄介なケースに遭遇しました。解析方法がわかりません。私の質問は .NET に固有のものであり、CodePlex で JSON.NET ライブラリを使用しています (主に LINQ to JSON アプローチですが、他のアプローチを取ることもできます) が、これが他の言語プラットフォームでもどのように処理されるのか疑問に思います。

煩わしいケースは、最下位レベルの子でのみ配列と名前と値のペアを持たない JSON であり、そのノードには名前と値のペアとしてプロパティを取得する最下位レベルまでより多くのオブジェクトが含まれる JSON オブジェクトです。そして、中間ノードのリストを抽出したいのですが、クエリを実行している間、それらのノード名が事前にわかりません(動的です)。それらをどのように照会したり、それらを反復したりしますか。以下に例を示します。「response」の子であるノードのすべての名前が必要です。「Twenty5MBPhotos」や「TestPhotos」などの、albumData プロパティの親名。

{"status":200,"message":"OK","response":{"Twenty5MBPhotos":{"__albumData":{"id":"67b0de21d48290741598"}},"FiveMBPhotos":{"__albumData":{"id":"67b0de21d4a72ac5b401"}},"TestPhotos":{"__albumData":{"id":"67b0de21d64693a7f49f"}},"Sample album":{"__albumData":{"id":"67b0de21d67c4a99f4c3"}},"Empty":{"__albumData":{"id":"67b0de21d5fc3f2e05ac"}},"me":{"__albumData":{"id":"67b0de21d5bd2d1ea4f9"}},"satx":{"__albumData":{"id":"67b0de21d5b2f929c473"}},"designs":{"__albumData":{"id":"67b0de21d5a29b9f45c0"}},"views":{"__albumData":{"id":"67b0de21d5958c3b652e"}},"Puppy":{"__albumData":{"id":"67b0de21d540884dc413"}},"QaTest":{"__albumData":{"id":"67b0de21d6d96c35d419"}},"random":{"__albumData":{"id":"67b0de21d6b89b9ab401"}}}}

率直に言って、JSON 形式の方が簡単で、現在の形式ではなくプロパティのアルバム名とアルバム ID を含む配列が返されますが、私はこれを定義しませんでした。

4

1 に答える 1

1

次のようなすべての名前を取得できます。

    JObject obj = JObject.Parse(json);
    var children= obj["response"];

    foreach (var item in children)
    {
        string val = ((JProperty)item).Name;   
    }

名前の値を取得するには、JTokenをJPropertyとしてキャストする必要があります。

アップデート:

またはいくつかのlinqで

var theNamesAndIds = children.ToDictionary(m => ((JProperty)m).Name,
                                           m => m.First()["__albumData"]["id"]);

foreach (var item in theNamesAndIds)
{
    //item has your key(name) and value(Id)
}
于 2012-05-04T20:47:08.807 に答える