Newtonsoft 13.0.1 SelectTokens JSONPath过滤无返回问题咨询
问题原因
Newtonsoft.Json 13.0.1的JSONPath实现和部分在线测试工具的实现存在语法差异,你使用的$..myObject[?(@.myArray)]写法不符合Newtonsoft的解析规则:
- 该写法中
[?(@.myArray)]会被Newtonsoft识别为对myObject的子元素做过滤,仅当myObject是数组类型时才会遍历子元素执行校验 - 你的
myObject是对象类型,没有可遍历的子元素,因此过滤结果为空
写法修正
根据你的需求可以选择对应兼容Newtonsoft的写法:
- 如果你要查找所有名称为
myObject、且自身带有myArray属性的节点(你的示例数据中会返回2个匹配节点:根节点下的第一层myObject、嵌套在第一层myObject内的第二层myObject),使用:
data.SelectTokens("$..myObject[?(@.myArray != null)]")
如果上述写法仍然不生效,可以改用属性索引器写法提升兼容性:
data.SelectTokens("$..myObject[?(@['myArray'] != null)]")
- 如果你要查找所有带有
myObject.myArray属性的节点(你的示例数据中仅根节点符合,和你预期的1个返回结果一致),你提到的$..[?(@.myObject.myArray)]写法可以直接使用,兼容Newtonsoft实现:
data.SelectTokens("$..[?(@.myObject.myArray != null)]")
注意:Newtonsoft的存在性校验建议显式写
!= null,部分版本对简写的?(@.myArray)支持度不足。
内容的提问来源于stack exchange,提问作者Frans
相关产品推荐
相关产品推荐

