10

I need to select some values from a json response. Im using json.net, fine with the simpler stuff, but there doesnt seem to be much documentation/tutorials on anything past that. In the json example below i need to select all the ages:

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

}]

}

I have tried this and other variations:

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

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

and this:

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

response is a JObject from a webrequest. I just get back this:

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

The results are eventually put into a dictionary.

Any idea how to do this? i know it will be simple, i just havent found the right combination.

1 Answer 1

20

If you want to get the names of all students of all teachers, you can do it for example like this:

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

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

Or, as another option:

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

If you want them as IEnumerable<string>, just add Value<string>() at the end of the select. Or add Values<string>(), if you with the first option.

But it's usually better to create types for your object model, so that you can work with them as with normal objects and not as some special JSON objects.

If you have that, you could do something like:

var names = from teacher in response.TeacherHolder
            from student in teacher.Students
            select student.Name;
Sign up to request clarification or add additional context in comments.

3 Comments

Hi svick im using the first method - but i am getting back is: {Newtonsoft.Json.Linq.JEnumerable<Newtonsoft.Json.Linq.JToken>} in the names variable?
Yes, that's why I said you need to add Values<string>() if you want a collection of strings.
Hi svick i have added the values<string>() to the end. its now: var names = students.Children()["name"].Values<string>();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.