JSONPath 查询工具
使用 JSONPath 表达式从 JSON 数据中提取指定节点。支持 $ 根节点、.name 子节点、
..name 递归下降、[*] 通配符、[0] 数组索引、
[?(expr)] 过滤表达式(==、!=、>、<、=~ 正则匹配、
&&、||、!)。12 个预设示例覆盖典型场景,所有查询在浏览器本地完成。
✓ JSON 合法(1135 字符)
- #1string
Nigel Rees - #2string
Evelyn Waugh - #3string
Herman Melville - #4string
J. R. R. Tolkien
常见问题
什么是 JSONPath?它和 JSON Pointer、jq 有什么区别?
JSONPath 是一种 JSON 数据查询语言,语法形如 $.store.book[0].title,
通过路径表达式从 JSON 中提取节点。它由 Stefan Gössner 于 2007 年提出,2024 年由 IETF 标准化为 RFC 9535。
JSON Pointer(RFC 6901)是更简单的路径语法,形如 /store/book/0/title,
不支持过滤表达式、通配符、递归下降,主要用于 JSON Patch。jq 是功能更强的命令行 JSON 处理工具,
支持管道、函数、变量、条件分支等图灵完备语法,但语法学习成本较高。JSONPath 介于两者之间,适合嵌入式查询场景。
JSONPath 表达式中 $ 和 @ 有什么区别?
$ 表示根节点,是路径的起始点,形如 $.store.book 表示从根开始访问 store.book。
@ 表示当前节点,仅在过滤表达式 [?(...)] 内部使用,
用于引用当前正在判断的数组元素或对象值。例如 $..book[?(@.price < 10)] 中,
@ 表示 book 数组中的每个元素,@.price 表示该元素的 price 字段。
@ 不能出现在路径主体中,$ 通常不出现在过滤表达式内(除非显式引用根节点)。
递归下降(..)是什么?和点号访问有什么区别?
点号访问 .name 只访问当前节点的直接子字段,例如 $.store.book 只访问 root.store.book。
递归下降 ..name 会遍历 JSON 树的所有层级,返回所有名为 name 的字段值,
无论它们嵌套多深。例如 $..author 会找到 JSON 中所有层级的 author 字段。
递归下降还可以用 ..* 收集所有节点(对象、数组、原始值),
或 ..book[0] 先递归找 book 字段,再取每个 book 数组的第一个元素。
递归下降是 JSONPath 最强大的特性之一,但性能开销比点号访问大,深度嵌套数据上需注意。
过滤表达式 [?(expr)] 支持哪些运算符?
本工具支持以下过滤运算符:
比较:==(等于)、!=(不等于)、>(大于)、
>=(大于等于)、<(小于)、<=(小于等于);
正则匹配:=~(如 @.email =~ ".*@example\\.com");
逻辑:&&(与)、||(或)、!(非);
存在性:单独的 @.field 表示该字段存在且非 null。
例如 $..book[?(@.price < 10 && @.category == "fiction")] 表示价格小于 10 且类别为 fiction 的书。
过滤表达式内字符串字面量可用单引号或双引号,数字直接写,布尔与 null 用 true / false / null。
数组索引支持哪些形式?负索引怎么用?
单索引:[0] 取第一个元素,[2] 取第三个元素;
多索引:[0,1,2] 或 [0,2,4] 一次取多个元素,用逗号分隔;
负索引:[-1] 取最后一个元素,[-2] 取倒数第二个,负索引从 -1 开始;
通配符:[*] 取数组所有元素,等价于遍历。
本工具暂不支持切片语法 [1:5](起始:结束)与步长 [::2],
如需取连续范围可用多索引 [1,2,3,4] 替代。索引超出范围时返回空结果,不会报错。
JSONPath 在实际开发中有哪些典型应用场景?
API 响应数据提取:RESTful API 返回复杂嵌套 JSON,前端只需部分字段时用 JSONPath 提取,避免手写多层解构;
自动化测试断言:测试框架(如 Postman、JMeter、RestAssured)用 JSONPath 定位响应中的特定字段做断言;
JSON 配置查询:大型 JSON 配置文件(如 K8s manifest、OpenAPI spec)中查找特定资源或字段;
日志分析:JSON 格式日志中提取关键字段(如 $..error.message 找所有层级的 error.message);
数据转换:JSON 转 CSV、JSON 转表格时用 JSONPath 指定字段映射;
前端动态表单:根据 JSON Schema 用 JSONPath 实现字段联动与条件显示。
本工具的「复制全部结果」功能可直接生成 JSON 数组,粘贴到代码或文档中使用。
本工具的 JSONPath 实现与标准 RFC 9535 有什么差异?
本工具自研实现,覆盖 RFC 9535 常用语法子集,差异如下:
已支持:$、.name、['name']、[index]、[0,1] 多索引、[*] 通配符、..name 递归下降、..* 递归所有、
[?(filter)] 过滤表达式(==、!=、>、>=、<、<=、=~、&&、||、!)、@ 当前节点、负索引;
暂不支持:切片 [1:5] 与步长 [::2]、
函数(length()、count()、min()、max() 等)、
父节点引用 ^、命名过滤器 [?(@.a>&@.b)] 复杂比较、
多键 ['a','b'](仅单键生效)。
实现采用三阶段架构:tokenizer(词法分析)→ parser(语法分析构建 AST)→ evaluator(求值),
全程零依赖纯函数,便于扩展。如需完整 RFC 9535 实现,可考虑引入 jsonpath-plus 库(约 50KB)。
查询结果是数组还是单个值?如何区分?
JSONPath 查询结果始终是数组(节点列表),即使只匹配到一个元素。
例如 $.store.book[0].title 返回 ["Sayings of the Century"](含一个字符串的数组),
而非裸字符串 "Sayings of the Century"。
这是因为 JSONPath 设计上需要支持多匹配场景(如 $..author 返回多个作者),
为保持一致性,单匹配也用数组包裹。
本工具的「复制单条」按钮会复制该元素的原始值(去除数组包裹),
「复制全部」按钮会复制完整的 JSON 数组。在代码中使用时需注意取第一个元素:
jsonpath.query(data, '$.store.book[0].title')[0]。