asp.net - JSON.net linq无法使用where语句选择节点

标签 asp.net json linq json.net

我正在尝试选择 empUID 等于某个 ID 的节点。这是我的 JSON 片段

{
    "dsShedule": {
        "ttEmployee": [
            {
                "empUID": 2649,
                "empNameFirst": "Firstname",
                "empNameLast": "lastName",
                "empFunction": "AFWERKER DRUKKERIJ",
                "ttShedule": [
                    {
                        "UID": 47,
                        "empUID": 2649,
                        "datStart": "2013-05-20",
                        "datStop": "2013-05-20",
                        "regime": 1,
                        "state": "PLANNED",
                        "ttSheduleDay": [
                            {
                                "SheduleUID": 47,
                                "dat": "2013-05-20",
                                "dateTimeStart": "2013-05-20T08:00:00.000",
                                "dateTimeStop": "2013-05-20T17:00:00.000",
                                "duration": 8
                            }
                        ]
                    },
                    {
                        "UID": 57,
                        "empUID": 2649,
                        "datStart": "2013-05-21",
                        "datStop": "2013-05-21",
                        "regime": 1,
                        "state": "PLANNED",
                        "ttSheduleDay": [
                            {
                                "SheduleUID": 57,
                                "dat": "2013-05-21",
                                "dateTimeStart": "2013-05-21T08:00:00.000",
                                "dateTimeStop": "2013-05-21T17:00:00.000",
                                "duration": 8
                            }
                        ]
                    }
                ]
            },

我可以选择所有员工节点,但是当我尝试选择 ID 等于(例如 494323)的节点时,找不到它。

函数

        JObject jObj = JObject.Parse(json);
        int firstUID = 494323;
        var linq = jObj["dsShedule"]["ttEmployee"].Select(x => new
                        {
                            empUID = x.SelectToken("empUID"),
                            empNameFirst = x.SelectToken("empNameFirst"),
                            empNameLast = x.SelectToken("empNameLast"),
                            ttShedule = x.SelectToken("ttShedule")
                        });
        var uid = linq.Where(x => x.empUID.Equals(firstUID));

我正在使用 VS2012,当我调试元素 linq 并查找 empUID 的值时,它显示值 {494323} (为什么是括号?)。

下面是变量图片:

enter image description here

如您所见,uid 为空,我缺少什么?

提前致谢

最佳答案

您选择的不是选择查询中的值,而是 JToken 对象:

empUID = x.SelectToken("empUID")

empUID 的类型为 JToken(您可以在调试 View 中看到该类型)。 然后您尝试将整数与 JToken 进行比较,但会失败。

只需选择如下值:

empUID = x.SelectToken("empUID").Value<int>()

或者使用Value<T>比较时:

var uid = linq.Where(x => x.empUID.Value<int>() == firstUID);

编辑

我不确定你到底想要什么,但这应该会给你一个想法。

  1. 使用给定的 empUID 过滤 ttEmployee 数组中的第一个条目
  2. 选择该条目的 ttShedule 数组
  3. 使用 Where 进行过滤所有 ttSchedule 条目,包含具有给定值 dat 属性的 ttSheduleDay:

    var linq = jObj["dsShedule"]["ttEmployee"]
             // first filter for a single emp by empUID
             .First(emp => emp["empUID"].Value<int>() == firstUID)
             // then select the ttShedule array of that emp
             .Select(emp => emp["ttShedule"])
             // now filter for whatever ttShedule you need
             .Where(shed => shed["ttSheduleDay"]
                          .Any(day => day["dat"].Value<DateTime>() 
                                                 == new DateTime(2013, 5, 24))
    

关于asp.net - JSON.net linq无法使用where语句选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16713932/

相关文章:

java - java代码中解析json对象

javascript - 计算某个键的值在 JSON 中出现的次数

c# - 如何使用 Linq 从 List<Object> 中获取第一个对象

c# - 复杂的 Linq 分组

c# - 以编程方式为 .net 站点设置 "Convert to Application"选项

asp.net - TeamCity调用网址构建步骤

C#/ASP.NET 遍历表

java - 在 Jackson Mixins 中同时使用 @JsonIgnore 和 @JsonProperty 时出现问题

ASP.NET MVC 包罗万象的路由

c# - 如何解决 EF 生成 SQL 语句嵌套太深的问题