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

Json.NET JSONPath query not returning expected results

我正在使用 Newtonsoft 的 Json.Net 到 select 来自以下 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')]

可以,但显然我对语法的理解不够好。这 returns 一个空列表:

 var test1 =  json.SelectTokens("$.projects[*].client[?(@.code == 'DEF')]").ToList();

而单个标记 select 或 returns 为空:

  var test2 =  json.SelectToken("$.projects[*].client[?(@.code == 'DEF')]");

我在 https://jsonpath.curiousconcept.com/ 上尝试了几种不同的配置,看来我的查询语法确实有问题。

使用 Flow Communications 的 JSONPath 0.3.4 实现(在上面 link)我可以使用

获取客户端
$..[?(@.code == 'DEF')]

但是,此语法似乎对 Json.Net 无效(对同一页面上的 Goessner 实现也无效)。

有人看到我做错了什么吗?

Json.NET 的 JSONPath parser 允许过滤器(脚本)表达式 [?( )] 查询候选数组项的子对象内的嵌套属性。于是

var test = json.SelectTokens(@"$.projects[?(@.client.code == 'DEF')].client");

returns,随心所欲,

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

工作.Net fiddle

根据实验,jsonpath.curiousconcept.com support this syntax, however it works correctly at jsonpath.com which uses https://github.com/ashphy/jsonpath-online-evaluator. The JSONPath proposal 的 JSONPath 实现似乎 none 只是声明 () 是一个 脚本表达式,使用底层脚本引擎 这显然为解释 "should" 是否有效以及如何起作用留下了一些解释空间。

apparently do not work with Json.NET because, as of version 10.0.3, it only officially supports applying filters to array items and not directly to objects -- see Issue #1256: JSONPath scripts not executing correctly for objects for a discussion. (Though sometimes cunning workarounds can be found, for instance in 中使用的过滤器。)然而,在过滤器中使用嵌套属性似乎旨在起作用(并且确实起作用)。