[英]Json.NET JSONPath query not returning expected results
我正在使用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();
单个标记选择器返回null:
var test2 = json.SelectToken("$.projects[*].client[?(@.code == 'DEF')]");
我在https://jsonpath.curiousconcept.com/上尝试了一些不同的配置,看起来我的查询语法确实破了。
使用Flow Communications的JSONPath 0.3.4实现(在上面的链接上)我可以使用
$..[?(@.code == 'DEF')]
但是,这种语法似乎对Json.Net不起作用(也不是同一页面上的Goessner实现)。
有谁看到我做错了什么?
Json.NET的JSONPath解析器允许过滤器(脚本)表达式[?( )]
查询候选数组项的子对象内的嵌套属性。 从而
var test = json.SelectTokens(@"$.projects[?(@.client.code == 'DEF')].client");
根据需要返回
[
{
"code": "DEF",
"name": "Client 2"
}
]
工作.Net小提琴 。
在实验似乎没有JSONPath实现在jsonpath.curiousconcept.com支持这个语法,但它工作正常,在jsonpath.com它采用https://github.com/ashphy/jsonpath-online-evaluator 。 JSONPath提议简单地声明()
是一个脚本表达式,使用底层脚本引擎 ,这显然留下了一些空间来解释这个“应该”是否以及如何工作。
问题中使用的过滤器显然不适用于Json.NET,因为从版本10.0.3开始,它只正式支持将过滤器应用于数组项而不是直接应用于对象 - 请参阅问题#1256:JSONPath脚本未正确执行讨论的对象 。 (虽然有时可以找到狡猾的解决方法,例如在这个答案中 。)然而,在过滤器中使用嵌套属性似乎是有效的(并且确实有效)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.