toolgarden.xyz
EN

JSONPath 查询

用 JSONPath 表达式从嵌套 JSON / JSONC / JSON5 中精确提取字段,支持通配符与过滤条件,浏览器本地完成。

输入 JSON / JSONC / JSON5

JSONPath 表达式

查询结果

[
  "活着",
  "围城",
  "白夜行"
]

工具说明

JSONPath 用一条表达式从嵌套 JSON 中选择节点,作用类似文件路径和查询条件的结合。根节点写作 `$`,点号或方括号访问属性,`*` 选择同级全部成员,递归下降与过滤表达式可在未知深度或数组中查找匹配项。

工具基于 jsonpath-plus 执行查询,结果始终以数组形式输出,即使只命中一个值。这能区分“没有命中”和“命中一个值”,也便于把同一表达式用于单项与多项数据。

使用步骤

  1. 输入完整 JSON

    先确认数据能够解析,并找到准备查询的根对象或数组。

  2. 编写 JSONPath

    从 `$` 开始逐层缩小范围,先用简单属性和索引,再增加通配符或过滤条件。

  3. 检查结果集合

    确认命中数量和类型;空数组表示表达式有效但没有匹配节点。

输入与输出示例

三种常见表达式在同一份数据上的结果。注意返回值始终是数组。

数据与表达式
// data
{ "books": [
    { "title": "A", "price": 8 },
    { "title": "B", "price": 20 } ] }

$.books[*].title
$.books[?(@.price < 10)].title
查询结果
["A", "B"]

["A"]

支持范围与限制

表达式语法
JSONPath,根节点为 $,用点号或方括号逐层访问
常用写法
$.store.book[0].title 取单值,$..author 递归搜索,$.book[*].price 取全部
过滤器
支持 ?() 条件过滤,如 $.book[?(@.price < 10)]
返回形式
始终返回匹配结果的数组,没有匹配时返回空数组而不是报错
与结构查看的区别
格式化适合浏览整体结构,JSONPath 适合从超大文档里精确取出你要的那部分
方言差异
JSONPath 没有单一权威规范,不同实现对过滤器和递归的支持略有出入

典型使用场景

  • 从接口响应取字段

    从深层分页响应里一次提取所有商品 ID、错误消息或用户邮箱。

  • 验证数据分布

    用过滤表达式找出价格超范围、状态异常或缺少目标字段的数组成员。

  • 从超大响应里取出目标子树

    几十 MB 的响应用树形视图翻找很慢,用一条表达式直接取出需要的分支再单独查看。

使用前需要知道的事

  • 属性名包含点号、空格或短横线时,应使用方括号加引号访问,避免被解析成多个路径段。
  • 过滤表达式可以执行条件判断,不要把不可信表达式直接嵌入生产代码。
  • JSONPath 有多个实现方言,复杂表达式移植到其它库前应重新测试。

相关概念

root selector
表达式开头的 `$`,代表当前 JSON 文档根值。
recursive descent
使用 `..` 在任意深度查找指定属性,方便但可能命中比预期更多的节点。

常见问题

JSONPath 能做什么?
用 JSONPath 表达式(如 $.store.book[*].title)可以从嵌套 JSON 中精准提取字段或数组元素。
支持通配符和过滤条件吗?
支持。可使用通配符、递归下降和过滤表达式,从复杂结构中筛选出需要的数据。
查询会上传数据吗?
不会。JSONPath 查询在浏览器本地执行,数据不会上传到服务器。
结果为什么总是数组?
因为 JSONPath 的语义是「选择所有匹配的节点」,匹配数量可能是 0、1 或多个。统一返回数组可以区分「没有命中」(空数组)和「命中一个」(长度 1),同一表达式也就能同时处理单值和多值场景。
属性名里有点号或短横线怎么写?
用方括号加引号:`$['user-name']` 或 `$['a.b']`。直接写 `$.user-name` 会被解析成减法或多个路径段,得不到预期结果。