如何用JsonPath筛选NewtonsoftJson数组中不含指定属性的对象
如何用Newtonsoft.Json的JSON Path筛选数组中不包含指定属性的对象?
我懂你现在的困扰——已经能用JSON Path筛选出包含item2的数组元素,但想反转逻辑时用!却报错,这确实挺闹心的。
先梳理下你的场景:
你有这样的JSON结构:
{ "property1": 1, "property2": 2, "someArray": [ { "item1": 1, "item2": 2 }, { "item1": 5 } ] }
已经成功筛选包含item2的代码:
// 筛选所有包含item2属性的令牌 var tokens = jsonToken.SelectTokens("$.someArray[?(@.item2)]");
问题出在Newtonsoft.Json的JSON Path语法特性上,它并不支持直接用!对属性存在性做取反操作。不过有两个靠谱的方法可以实现你的需求:
方法一:通过判断属性为null匹配不存在的情况
当对象没有某个属性时,@.属性名会返回null,我们可以利用这个特性筛选:
var tokens = jsonToken.SelectTokens("$.someArray[?(@.item2 == null)]");
这样就能精准匹配someArray里那些没有item2属性的对象。
方法二:结合LINQ实现筛选
如果觉得JSON Path的写法不够直观,也可以先拿到整个数组令牌,再用LINQ做过滤:
var arrayToken = jsonToken.SelectToken("$.someArray"); var filteredTokens = arrayToken.Where(t => !t["item2"].Exists());
这里用Exists()方法直接检查item2属性是否存在,取反后就是我们要的结果。
简单解释下为什么!不行:Newtonsoft的JSON Path实现和标准JSONPath有语法差异,它的过滤表达式里不支持直接用!做逻辑非,所以得用上面两种变通方式来实现。
内容的提问来源于stack exchange,提问作者msmolcic
相关产品推荐
相关产品推荐

