【问题标题】:JSON.NET Selecting items in array with linqJSON.NET使用linq选择数组中的项目
【发布时间】:2012-04-16 13:55:27
【问题描述】:

我需要从 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();

response 是来自 webrequest 的 JObject。 我刚刚得到这个:

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

结果最终被放入字典。

知道怎么做吗?我知道这很简单,我只是还没有找到合适的组合。

【问题讨论】:

    标签: json linq json.net


    【解决方案1】:

    如果你想得到所有老师的所有学生的名字,你可以这样做例如:

    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;
    

    【讨论】:

    • 嗨 svick 我使用第一种方法 - 但我回来的是:名称变量中的 {Newtonsoft.Json.Linq.JEnumerable}?
    • 是的,这就是为什么我说如果你想要strings的集合,你需要添加Values<string>()
    • 嗨 svick 我已将 values() 添加到末尾。现在是: var names = students.Children()["name"].Values();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2019-10-18
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多