如何仅用SelectTokens替代Where方法筛选JSON中的list1元素
解决方案
正确的JSONPath表达式
要直接用SelectTokens筛选出符合条件的list1元素,你需要调整JSONPath,让它定位到list1层级并添加过滤条件,而非深入到list2。正确的表达式如下:
var test2 = jsonVal.SelectTokens("data.list1[?(@.list2[*].value > 15)]");
这个表达式的逻辑是:遍历data.list1下的所有元素,仅保留那些自身包含的list2子元素中存在value>15项的list1元素,和你原代码用Where筛选的结果完全一致。
将查询的特定部分存入变量
如果要把查询中的固定片段(比如过滤条件)提取成变量,直接拆分JSONPath字符串即可:
// 提取筛选条件部分为变量 var listFilter = "[?(@.list2[*].value > 15)]"; // 拼接完整路径并调用SelectTokens var test2 = jsonVal.SelectTokens($"data.list1{listFilter}");
你也可以拆分更细的片段,比如把基础路径单独存储:
var basePath = "data.list1"; var listFilter = "[?(@.list2[*].value > 15)]"; var test2 = jsonVal.SelectTokens($"{basePath}{listFilter}");
你之前写法的问题
你之前使用的data.list1[*].list2[?(@.value > 15)]是直接定位到符合条件的list2子元素,返回的是list2层级的对象,而非你需要的list1父元素,这就是为什么只能获取到匹配的list2项,而非对应的list1元素。
内容的提问来源于stack exchange,提问作者Anıl
相关产品推荐
相关产品推荐

