JSONPath 查询
JSONPath 查询,是用一条以 $ 开头的路径表达式从 JSON 里取出指定字段的方法,相当于给 JSON 用的「XPath」。本工具按 RFC 9535 标准实现,支持点号与方括号取键、通配 *、递归下降 ..、负下标与切片、[?@.price < 10] 式条件过滤和 length、match 等函数,逐条列出命中值和路径,查不到时告诉你卡在哪一段。全程在浏览器本地运行,JSON 不上传。
输入以 $ 开头的 JSONPath 表达式,或点下方示例。
贴入 JSON 并输入表达式后自动查询。
🔒 JSON 与表达式只在你的浏览器里解析和查询,不上传任何服务器。按 RFC 9535 标准求值,只查询不修改;部分旧方言写法不支持,会提示改写。
如何使用JSONPath 查询
把 JSON 粘贴进输入框,或点「选择文件」打开 .json(文件只在浏览器里读取,不上传);没有现成数据可以先在「填入示例」里选书店样例或中文订单样例。
在上方输入以 $ 开头的表达式,如 $.store.book[0].title;不熟语法可点表达式框下方的示例一键填入,写错时会指出是第几个字符、原因是什么。
结果即时列出每个命中值和它的路径,可在可读路径与规范化路径之间切换,复制全部结果 JSON、复制全部路径或下载 jsonpath-result.json;查不到时看逐段计数,定位是哪一段变成了 0 个。
关于JSONPath 查询的常见问题
- JSONPath 查询会上传我的 JSON 吗
- 不会。JSON 的解析、表达式的解析和求值都在你自己的浏览器里完成,表达式也不上传,关闭页面即清除。本机只记住四项界面偏好(路径格式、视图、缩进、是否去重),JSON 内容与表达式都不写进 localStorage——表达式里常有手机号、订单号这类过滤值。页面也不会把输入放进网址,所以不存在通过分享链接泄露数据的问题。
- JSONPath 的 $ 和 @ 分别是什么意思
- $ 代表整个 JSON(根节点),每条 JSONPath 表达式都必须以它开头,比如 $.store.book;@ 只在过滤条件里用,代表当前正在判断的那个元素,比如 $.list[?@.age > 18] 里的 @ 就是 list 中的每一项。过滤器里也可以写 $ 引用根节点上的值,例如 $.items[?@.price > $.limit]。
- JSONPath 怎么按条件过滤数组元素
- 用 [?条件],例如 $.list[?@.status == "paid"] 取出已支付的订单;多条件用 && 和 ||,取反用 !,可以加括号分组。只写 [?@.isbn] 表示「有 isbn 这个键」,值为 null、false、0 或空字符串也算有,这与 JavaScript 的真假判断不同。比较两侧类型不同时一律为假,1 == "1" 不成立,字符串按 Unicode 码点比较大小。
- JSONPath 的 .. 递归下降怎么用
- .. 表示任意深度:$..id 会取出所有层级上名为 id 的值,$..* 会列出整棵树的全部节点,$..[0] 取出每个数组的第一个元素。它会遍历整棵树,大 JSON 上建议写成 $.data..id 先收窄到具体分支。本工具对计算量设了上限,超出会中止并提示改写,页面不会卡死。
- JSONPath 怎么取数组的最后一个元素
- 用负下标 [-1],例如 $.store.book[-1];倒数第二个是 [-2]。取一段用切片 [起:止:步长],如 [0:2] 取前两个、[-2:] 取最后两个、[::-1] 整体倒序,步长为 0 时按标准返回空。老教程里的 [(@.length-1)] 是 Goessner 脚本写法,RFC 9535 不支持,本工具会提示你改成 [-1]。
- JSONPath 查询为什么返回空结果
- 常见原因有三类:键名大小写或拼写不符;对数组直接用了 .name(应写成 [*].name);或者把数字和字符串比较,比如价格存成了 "8.99" 字符串却写 @.price > 5。本工具在零命中时会逐段显示节点数,指出从哪一段开始变成 0 个,并给出相近的键名或元素的实际值类型。
- JSONPath 的中文键名应该怎么写
- 直接写。RFC 9535 允许简写键名包含中文和 emoji,所以 $.数据.列表[0].收货人 是合法表达式,不必改成方括号。键名以数字开头或含有横线、空格、点号时才需要方括号加引号,例如 $["order-id"]、$["2fa"]。注意不要用中文输入法下的全角符号,本工具检测到会单独提示。
- JSONPath 和 jq、JMESPath 有什么区别
- 三者都能从 JSON 里取值:JSONPath 已有 RFC 9535 正式标准,只查询不变换,多用于接口测试断言和配置取值;jq 是一门带变换能力的命令行语言,可以重组输出;JMESPath 多见于 AWS CLI 的 --query 参数。语法互不兼容,本工具只支持 JSONPath。
- JSONPath 查询能取出字段的路径吗
- 能。每个结果都附带路径,默认显示可读路径 $.store.book[0].title,可以切换为 RFC 定义的规范化路径 $['store']['book'][0]['title'],点击路径即可复制,也可以一键复制全部路径(一行一条),方便写进代码或测试断言。
- JSONPath 查询结果的大数字会丢精度吗
- 不会。本工具读取 JSON 时保留数字原文,19 位以上的订单号 12345678901234567890 会原样输出,不会变成 12345678901234567000,1.10 也不会被改成 1.1。比较大小时同样按十进制精确比较。但要注意,你自己的程序用 JSON.parse 读取同一份数据时仍会丢精度,页面会对此单独提示。
- JSONPath 在线查询能处理多大的 JSON 文件
- 粘贴或打开的 JSON 上限约 1,000,000 字符,超出会直接拦截并提示缩短,不会让页面卡死;单次查询最多列出 10,000 个命中节点,超出时只显示前 10,000 个,并提示加过滤条件收窄范围。表达式本身最长 2,000 个字符。上限按字符数而非字节数计,以英文为主的 JSON 大约对应 1 MB;常见的接口返回和配置文件一般都在范围内,更大的日志导出建议先截取相关片段再查。
- JSONPath 在线测试手机上能用吗
- 能。页面按手机屏幕自适应排版,用手机浏览器打开后粘贴 JSON、或点「选择文件」从手机里选 .json 即可查询,同样只在本机处理不上传。求值放在后台线程里执行,输入表达式时不会阻塞打字。手机内存比电脑小,接近上限的大 JSON 建议换到电脑上查。
JSONPath 语法速查表(附书店样例实测结果)
下表的「示例结果」是本工具对「填入示例 → 书店样例(RFC 9535)」这份数据的真实查询结果,复制左列表达式到上方即可复现。JSONPath 表达式由根 $ 加若干段组成,每段用 .键名 或 [选择器] 写成,选择器可以是键名、下标、切片、通配 * 或 ?过滤条件。
| 写法 | 含义 | 示例结果 |
|---|---|---|
$ | 整个 JSON(根) | 1 个:{…} 1 个键 |
$.store.book | 按键取值(等价于 $['store']['book']) | 1 个:[…] 4 项 |
$.store.* | 对象的全部成员值 | 2 个:[…] 4 项、{…} 2 个键 |
$..author | 任意深度下的 author | 4 个:"Nigel Rees"、"Evelyn Waugh" 等 |
$.store.book[-1] | 最后 1 个元素([0] 是第 1 个) | 1 个:{…} 5 个键 |
$.store.book[0:2] | 切片:第 1~2 个元素 | 2 个:{…} 4 个键、{…} 4 个键 |
$.store.book[::-1] | 倒序 | 4 个:{…} 5 个键、{…} 5 个键 等 |
$.store.book[0,2] | 多个下标 | 2 个:{…} 4 个键、{…} 5 个键 |
$..book[?@.isbn] | 有 isbn 键的书(值为 null 也算) | 2 个:{…} 5 个键、{…} 5 个键 |
$..book[?@.price < 10].title | 价格低于 10 的书名 | 2 个:"Sayings of the Century"、"Moby Dick" |
$..book[?@.category == 'fiction' && @.price > 10] | 多条件同时满足 | 2 个:{…} 4 个键、{…} 5 个键 |
$..book[?match(@.author, '.*Tolkien')] | 正则整串匹配 | 1 个:{…} 5 个键 |
$..book[?length(@.title) > 15] | 按字符串长度过滤 | 2 个:{…} 4 个键、{…} 5 个键 |
JSONPath 在线解析的三种常见用法
把它当成一个 JSON 取值工具,最常见的用法有三类。一是接口联调:从几百行的返回里 JSON 提取字段,例如用 $.data.list[*].orderId 一次拿到全部订单号,再点「复制结果 JSON」带走。二是写自动化测试断言之前,先在这里做一次 JSON 路径查询,确认表达式只命中你想要的节点,再把右侧的路径原样写进断言。三是排查配置:用 JSONPath 递归 $..timeout 找出所有层级的超时设置,每个结果都附带它所在的位置。
JSONPath 过滤与 JSONPath 数组过滤说的是同一件事:[?条件] 对数组的每个元素(或对象的每个成员值)逐个判断,条件为真的留下。本页的 JSONPath 在线解析严格遵循 JSONPath RFC 9535,英文资料里这类页面常叫 JSONPath online tester。JSONPath 不上传是本页的硬约束:JSON 与表达式只在当前浏览器标签页里处理,不经过任何服务器。
JSONPath 方言差异:老写法为什么报错
JSONPath 在 2024 年成为 RFC 9535 标准之前,各家实现(Goessner 原版、Java 的 Jayway、JavaScript 的 jsonpath-plus)各有扩展,网上的教程常常混用。本工具严格按标准实现,遇到下面这些方言写法会给出改写提示,而不是静默返回空。
| 方言写法 | 来源 | RFC 9535 写法 |
|---|---|---|
[?(@.name =~ /abc/i)] | Jayway / jsonpath-plus | [?match(@.name, '[Aa][Bb][Cc]')] |
@.length | Goessner / Jayway | length(@) |
[(@.length-1)] | Goessner 脚本表达式 | [-1] |
[?(@.tag in ['a','b'])] | Jayway | [?@.tag == 'a' || @.tag == 'b'] |
JSONPath 在线测试工具的功能特点
- 按 RFC 9535 标准求值。过滤、切片、递归下降的边角行为都照标准来,并用官方一致性测试集(jsonpath-compliance-test-suite)的全部 706 条用例回归。
- 命中路径一目了然。每个结果都带 JSON 节点路径,可在可读路径与规范化路径之间切换,复制下来就能写进代码或测试断言,做 JSON 路径提取很方便。
- 查不到会告诉你原因。逐段显示命中数量,指出是键名拼错(给出相近键名)、类型不对还是条件都不满足。
- 大数字不丢精度。结果里的数字按原文输出,
orderId: 12345678901234567890用常见在线工具会显示为 12345678901234567000,本页原样输出。 - 中文键名直接写。
$.数据.列表[0].收货人合法,不必改写成方括号。 - 不执行任何脚本。过滤表达式由解析器解释执行,没有 eval,复杂正则超过 2 秒自动中止,页面不卡死。
- 数据不上传。JSON 与表达式都只在浏览器里处理,关闭页面即清除;它也是一个离线可用的 JSONPath tester,加载后断网照样能查。
适用边界:只查询不修改(不支持赋值或删除);只接受标准 JSON,不支持 JSON5、JSONC、NDJSON;正则比 I-Regexp 略宽(允许 \d \w \s),同时拒绝反向引用、零宽断言与懒惰量词,且没有忽略大小写标志。对象成员按原文档顺序输出,其它实现的顺序可能不同,RFC 允许这种差异。