C# Json.NET JSONPath查询未返回预期结果

C# Json.NET JSONPath查询未返回预期结果,c#,json,json.net,jsonpath,C#,Json,Json.net,Jsonpath,我使用Newtonsoft的Json.Net从以下Json中选择节点: { "projects":[ { "name":"Project 1", "client":{ "code":"ABC", "name":"Client 1" } }, { "name":"Project 2", "client

我使用Newtonsoft的Json.Net从以下Json中选择节点:

{  
   "projects":[  
      {  
         "name":"Project 1",
         "client":{  
            "code":"ABC",
            "name":"Client 1"
         }
      },
      {  
         "name":"Project 2",
         "client":{  
            "code":"DEF",
            "name":"Client 2"
         }
      },
      {  
         "name":"Project 3",
         "client":{  
            "code":"GHI",
            "name":"Client 3"
         }
      }
   ]
}
下面是c代码段

//json is a JObject representation of the json listed above
var clients =  json.SelectTokens("$.projects[*].client");
收益率:

[  
   {  
      "code":"ABC",
      "name":"Client 1"
   },
   {  
      "code":"DEF",
      "name":"Client 2"
   },
   {  
      "code":"GHI",
      "name":"Client 3"
   }
]
这很酷,现在,我想做的是按客户端代码过滤,我想

$.projects[*].client[?(@.code == 'DEF')]
可以,但我显然不太懂语法。这将返回一个空列表:

 var test1 =  json.SelectTokens("$.projects[*].client[?(@.code == 'DEF')]").ToList();
单个令牌选择器返回空值:

  var test2 =  json.SelectToken("$.projects[*].client[?(@.code == 'DEF')]");
我尝试了几种不同的配置,似乎我的查询语法确实被破坏了

在上面的链接上使用Flow Communications的JSONPath 0.3.4实现,我可以使用

$..[?(@.code == 'DEF')]
但是,这种语法对于Json.Net和同一页面上的Goessner实现似乎都无效

有人知道我做错了什么吗?

Json.NET允许筛选脚本表达式[?]查询候选数组项的子对象中的嵌套属性。因此

var test = json.SelectTokens(@"$.projects[?(@.client.code == 'DEF')].client");
根据需要返回

[
  {
    "code": "DEF",
    "name": "Client 2"
  }
]
工作

在实验中,似乎没有一个JSONPath实现支持这种语法,但是它在使用什么的时候工作正常。简单地说,这是一个脚本表达式,使用的是底层脚本引擎,这显然为解释是否以及如何工作留下了一些空间


中使用的过滤器显然不适用于Json.NET,因为从10.0.3版开始,它只正式支持将过滤器应用于数组项,而不直接应用于对象-有关讨论,请参阅。尽管有时可以找到巧妙的变通方法,例如在。然而,在过滤器中使用嵌套属性似乎是为了工作,而且确实有效。

您可以尝试在这里切换到jayway的实现,这将起作用。似乎在线实现的行为都有所不同。它在我的解决方案中非常有效,谢谢。就为了让我理解逻辑,过滤器应该应用于阵列在本例中,您对项目[…]进行筛选是因为它是一个数组,而不是在客户机{…}中,因为它是单个对象,因此无法进行筛选?@Jaco-该筛选器应该应用于数组?对从10.0.3开始,Json.NET似乎不正式支持过滤对象内部的对象。看见尽管有时可以找到巧妙的变通方法,例如在。