web-dev-qa-db-ja.com

JSON.NETlinqを使用して配列内のアイテムを選択する

Json応答からいくつかの値を選択する必要があります。私はjson.netを使用していますが、単純なものでも問題ありませんが、それ以降のドキュメントやチュートリアルはあまりないようです。以下のjsonの例では、すべての年齢を選択する必要があります。

{
"teacherHolder": [{
    "id": 200000001,
    "name": "Mr Test",
    "class": "a4",
    "students": [{
        "id": "100532469",
        "name": "ben"
    },
    {
        "id": "100506025",
        "name": "bill"
    },
    {
        "id": "100000447",
        "name": "bob"
    }]

}]

}

私はこれと他のバリエーションを試しました:

var stuff = response["teacherHolder"].Children()["students"];

var names = from y in stuff.Children().Values()
                    select y["name"];

この:

var names= response["teacherHolder"]
            .Select(s => (string)s.SelectToken("students[0].name")).ToList();

応答は、Web要求からのJObjectです。私はこれを取り戻します:

[{"Key":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]","Value":"Newtonsoft.Json.Linq.JEnumerable`1[Newtonsoft.Json.Linq.JToken]"}]

結果は最終的に辞書に入れられます。

これを行う方法はありますか?私はそれが簡単になることを知っています、私はちょうど正しい組み合わせを見つけていません。

10
gdp

すべての教師のすべての生徒の名前を取得したい場合は、たとえば次のように行うことができます。

_var students = response["teacherHolder"].Children()["students"];

var names = students.Children()["name"];
_

または、別のオプションとして:

_var names = from teacher in response["teacherHolder"]
            from student in teacher["students"]
            select student["name"];
_

それらを_IEnumerable<string>_として使用する場合は、selectの最後にValue<string>()を追加するだけです。または、最初のオプションを使用する場合は、Values<string>()を追加します。

ただし、通常は、オブジェクトモデルの型を作成して、特別なJSONオブジェクトとしてではなく、通常のオブジェクトと同じように操作できるようにすることをお勧めします。

あなたがそれを持っているなら、あなたは次のようなことをすることができます:

_var names = from teacher in response.TeacherHolder
            from student in teacher.Students
            select student.Name;
_
20
svick