C# Json.NET JSONPath查询未返回预期结果
我使用Newtonsoft的Json.Net从以下Json中选择节点: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
{
"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似乎不正式支持过滤对象内部的对象。看见尽管有时可以找到巧妙的变通方法,例如在。