使用Newtonsoft.Json.NET查询简单对象Id=1的正确JsonPath表达式
解决JsonPath匹配单个对象Id=1的问题
我帮你理清这个JsonPath的写法问题,针对你提到的两种JSON解析库,分别给出正确的表达式——先明确你的场景:你说的是无数组的单个对象(比如 {"Id": 1, "Name": "Test"}),要检查该对象是否包含Id=1。
Json.NET(Newtonsoft.Json)的正确写法
你之前的表达式 $..?[(@.Id == 1]) 有两处语法错误:多了一个多余的问号 ?,还有末尾多了一个右括号 ]。针对你的场景,正确的写法有两种:
- 匹配整个符合条件的对象:
解释:$[?(@.Id == 1)]$指代根节点(也就是这个单个对象),[?()]是过滤条件块,@代表当前被检查的节点(这里就是根对象)。如果对象的Id等于1,会返回该对象;否则返回空结果。 - 直接验证Id的值(返回布尔值):
这个表达式会直接返回$.Id == 1true或false,更适合做存在性检查。
Manatee.Json的正确写法
你之前尝试的 $[?($.Id == 1)] 不对,因为Manatee.Json的JsonPath语法里,过滤条件中要指代当前节点,得用 @ 而不是 $($ 始终代表根节点)。正确写法如下:
- 匹配整个符合条件的对象:
和Json.NET的这个写法完全一致,Manatee.Json会正确识别$[?(@.Id == 1)]@为当前过滤节点,从而匹配Id=1的根对象。 - 直接验证Id的值(返回布尔值):
同样,这个表达式会返回布尔值,直接验证根对象的$.Id == 1Id是否等于1。
额外补充:如果是对象数组的场景
要是你的JSON是对象数组(比如 [{"Id":1,"Name":"Test"},{"Id":2,"Name":"Another"}]),两种库都可以用下面的表达式匹配数组中Id=1的元素:
$[?(@.Id == 1)]
如果需要递归查找所有层级的对象(比如数组嵌套在其他结构里),可以用:
$..[?(@.Id == 1)]
总结一下,核心是注意语法的准确性:不要多余的符号,过滤条件里用@指代当前节点,$指代根节点,这样就能正确匹配到你要的结果了。
内容的提问来源于stack exchange,提问作者Stef Heyenrath
相关产品推荐
相关产品推荐

