JSONPath 查询
最后更新:2026年10月2日
对 JSON 文档运行 JSONPath 表达式,查看每一个匹配及其所在的路径。查询在你的浏览器中运行,文档不会被发送到任何地方。
查询语言能做什么
JSONPath 之于 JSON,就像文件夹路径之于文件系统:用简洁的方式说明你要哪些值。$ 是文档根,.name 进入某个属性,[…] 在数组中选择。
- 子节点:
$.store.bicycle.color,或者名字需要加引号时用$['store']['bicycle']['color']。 - 通配符:
$.store.book[*].title取每本书的标题;$.store.*取 store 对象的每个值。 - 递归下降:
$..price会在任意深度找到price。很好用,也容易匹配过多——见下文。 - 索引与切片:
[0]、[-1]表示最后一项、[0:2]取前两项、[0:5:2]按步长取。 - 联合:
[0,2]和['book','bicycle']可一次选择多个。 - 过滤器:
[?(@.price < 10)]保留价格低于十的项,运算符有== != < <= > >=,可用&&和||组合。
过滤器判断的是存在性,而不是真值
过滤器里单独的一个路径问的是该属性是否存在。所以 [?(@.inStock)] 会匹配 inStock 为 false 的项,因为该属性存在——这是 RFC 9535 的解读。当你想判断值本身时,就明确写出来:[?(@.inStock == true)]。这是 JSONPath 最常见的意外,属于语言本身的特性,而不是本工具的问题。
它有意不做的事
不实现过滤器函数(如 length()、match()、search()),也不支持正则表达式、括号中的脚本表达式,以及某些库添加的父节点/兄弟节点扩展。使用这些的查询会被拒绝并给出提示,而不是悄悄返回错误结果——本页明示了它支持什么,所以这里的「通过」就是字面意思。
常见问题
支持哪些 JSONPath 语法?
根 $、用 .name 或 ['name'] 访问子节点、通配符 .* 与 [*]、递归下降 ..name 与 ..*、数组索引(含负数)、切片 [start:end:step]、联合如 [0,1] 与 ['a','b'],以及过滤器 [?(@.price < 10)],运算符为 == != < <= > >=,可用 && 和 || 组合。
不支持哪些?
不实现过滤器函数(如 length()、match()、search()),也不支持正则表达式、括号中的脚本表达式,以及某些库添加的 JSONPath 扩展(如父节点/兄弟节点引用)。使用这些的查询会被拒绝,而不是悄悄返回错误结果。
为什么 ?(@.inStock) 会匹配 inStock 为 false 的项?
因为过滤器里单独的一个路径是存在性判断,而不是真值判断:它问的是这个属性在不在,而设为 false 的属性依然在。要判断真值请显式写 ?(@.inStock == true)。这是 RFC 9535 对过滤器的解读。
匹配结果会告诉我它来自哪里吗?
会。每个结果都会列出它所在的路径,采用与书写查询相同的点号与方括号写法,因此可以把这个路径直接粘回查询或其他 JSON 工具中使用。
我的文档会被上传吗?
不会。文档在你的浏览器中用 JSON.parse 解析,查询在内存中运行。不会上传任何内容,断开网络后页面依然可用。
为什么 $..price 返回的比我预期的多?
递归下降会访问文档的每一层,因此 ..price 会在任何位置找到 price 属性——无论在数组里、嵌套对象里还是不相关的分支里。要收窄范围,请用更多路径来限定,例如 $.store.book[*].price。
想改用 Schema 检查文档?JSON Schema 可以做到。发现错误?联系我们。