在我使用下面的“Where”方法的过程中,我到达了 json 中名为“list1”的列表。 我需要在不使用“Where”方法的情况下执行相同的操作,只使用一次“SelectTokens”。
当我尝试这个(test2)时,我只访问最后一项。
var test = jsonVal.SelectTokens("data.list1[*]").Where(x => x.SelectTokens("list2[?(@.value > 15)]").Count() != 0);
var test2 = jsonVal.SelectTokens($"data.list1[*].list2[?(@.value > 15)]");
ex json:
{
"data": {
"list1": [
{
"list2": [
{
"value": 20
}
]
},
{
"list2": [
{
"value": 10
}
]
}
]
}
}
注意:JSON 可能会造成混淆。基本上我想要的是能够将查询的特定部分传递给变量。
演示小提琴这里.
您可以使用 嵌套过滤器表达式 来选择
list1
的所有条目,这些条目至少有一个 list2
的匹配条目,如下所示:
var items = jsonVal.SelectTokens("data.list1[?(@.list2[?(@.value > 15)])]");
退回的物品,序列化后,按要求匹配
test
的内容:
[
{
"list2": [
{
"value": 20
}
]
}
]
备注:
内部表达式
list2[?(@.value > 15)]
选择 list2 中值 > 15 的所有条目。
外层表达式
data.list1[?(@list2 query)]
选择 list1 中与 list2 中具有匹配项的所有条目。
我不确定嵌套过滤器表达式是否适用于所有 JSONPath 实现。如果我在 https://jsonpath.curiousconcept.com/ 上尝试上述查询 + JSON,Stefan Goessner 的 JSONPath 0.8.3 和 Flow Communications 的 JSONPath 0.5.0 都无法评估查询。
JSONPath 提案 只是声明
?()
应该应用过滤器(脚本)表达式“使用底层脚本引擎”,这是非常模糊的。
演示小提琴这里.