Skip to content

免费 JSONPath 测试工具 — 在线求值查询表达式

即时对任意 JSON 测试 JSONPath 表达式。内置 RFC 9535 标准引擎与经典 Goessner 模式,支持 Values / Paths / Both 视图、规范化路径、零 eval。100% 私密,全程在浏览器中运行,无需上传、无需注册。

无追踪 浏览器中运行 免费
所有求值都在你的浏览器中本地运行。你的 JSON 和表达式绝不离开本设备。无 eval,无上传。
引擎
 
JSONPath 速查表
$根元素
@当前元素(在过滤器中)
.name子成员
..name递归下降
[*]所有元素 / 成员
[0]数组索引
[0:2]数组切片 [start:end:step]
[a,b]名称 / 索引的并集
[?(@.k>1)]过滤表达式
length()RFC 9535 函数:length / count / match / search / value
已就 RFC 9535 语法保真度、规范化路径正确性、双引擎在常见路径上的语义一致性及边界情况下有据可查的分歧、无 eval 安全性(关闭 CVE-2024-21534 与 CVE-2025-1302),以及无障碍性(ARIA 角色、引擎切换的 radiogroup、屏幕阅读器结果播报、RTL 布局下的 LTR JSON 处理)进行了审阅。 — Go Tools 数据工具团队 · 2026年6月13日

什么是 JSONPath 测试工具?

JSONPath 测试工具是一种让你编写 JSONPath 表达式、粘贴 JSON 文档,并精确看到表达式选中了哪些节点 —— 既包括匹配的值,也包括它们的确切位置 —— 而无需编写代码或运行脚本的工具。对开发者而言,它把循环时间从分钟缩短到毫秒:调整路径、观察结果变化,然后放心地交付查询。

JSONPath 是面向 JSON 的查询语言,是 XPath 之于 XML 的 JSON 类比。表达式由一小套选择器构成。$ 是文档的根。点号或方括号步入子项:$.store 或 $['store']。双点号 .. 是递归下降 —— 它搜索树的每一层。通配符 * 选取所有元素或成员。方括号承载数组索引([0])、切片([start:end:step])、并集([a,b])和过滤表达式([?(@.price < 10)],其中 @ 是被测试的元素)。借助这些部件,你可以从深度嵌套的 API 响应中提取单个字段、在测试中对值做断言、在 Kubernetes、AWS Step Functions、Azure Logic Apps 等系统中驱动数据转换,或从不规则的 JSON 中提取结构化数据 —— 全程无需命令式遍历代码。JSONPath 在各实现之间的不一致也是出了名的,而这恰恰是优秀测试工具在问题流入生产前就揭示出来的痛点。

本测试工具内置两个引擎。默认是 RFC 9535 引擎:RFC 9535 是 IETF 于 2024 年 2 月发布的 JSONPath 正式规范,是该语言在历经十五年分歧实现后首次被精确标准化。它定义了精确的语法、为结果引入了规范化路径的概念,以及五个标准函数 —— length()、count()、match()、search()、value()。我们的 RFC 9535 引擎是零依赖实现,不使用任何 eval,因此用自己的语法解析并解释表达式,而非把它们编译成 JavaScript。第二个引擎是经典 (Goessner),即大多数旧版在线工具和库实现的 2007 年事实方言;切换到它即可重现 jsonpath.com 这类工具的结果,或运行你从旧代码复制来的表达式。两种方言在常见路径上一致,但在边界情况下分歧 —— 过滤器的空白与引号、并集顺序、缺失成员如何比较,以及存在哪些函数 —— 因此能在一处之间来回切换,是诊断某个表达式为何与你预期行为不同的最快方式。

本测试工具在原始值之外还揭示什么:JSONPath 查询的结果是一个节点列表,而本工具可以用三种方式展示它。Values 视图把匹配的节点渲染为 JSON 数组,正是你在代码中会使用的形式。Paths 视图渲染每条匹配的规范化路径 —— 一种规范的、用方括号加引号的位置表示,如 $['store']['book'][0]['title'],无论表达式是怎么写的,它都唯一标识该值在文档中的所在。选中同一节点的两个表达式会产生相同的规范化路径,这让 Paths 视图在调试时极为宝贵。Both 视图把值和路径并排显示。统计行报告匹配了多少个节点。

安全在这里是头等要务。许多在线 JSONPath 求值器在服务器上运行,或嵌入用 JavaScript eval 求值过滤谓词的库 —— 正是这种设计在广泛使用的 JSONPath 包中催生了被记录为 CVE-2024-21534 和 CVE-2025-1302 的远程代码执行漏洞。本工具根本不使用 eval。RFC 9535 引擎没有任何 eval 路径,经典引擎则基于一个显式禁用 eval、经过修补并锁定版本的 jsonpath-plus。这关闭了那一类 RCE 漏洞,并让本工具能在禁止 unsafe-eval 的严格内容安全策略下运行。每次求值都在本地进行:你的 JSON 和表达式绝不离开页面、绝不被记录、绝不存盘 —— 只有你的引擎和视图偏好会持久化到 localStorage。这使得本工具可以安全地处理专有 API 负载、脱敏日志、内部配置,以及任何你不愿粘贴到依赖服务器的服务中的、带 schema 的数据。

如果你的任务是处理 JSON,请把它与本站的其他 JSON 工具搭配使用:用 JSON 格式化 格式化并美化你的输入,用 JSON Diff 比较两个文档,用 JSON Schema 校验器 对照 schema 检查负载,或用 JSON 转 TypeScript 把示例响应转换为带类型的接口。

// The expression you build in this tester maps straight onto the
// RFC 9535 reference library used under the hood.
import { query, paths } from 'jsonpath-rfc9535';

const document = {
  store: {
    book: [
      { title: 'Sayings of the Century', author: 'Nigel Rees', price: 8.95 },
      { title: 'Sword of Honour', author: 'Evelyn Waugh', price: 12.99 },
      { title: 'Moby Dick', author: 'Herman Melville', price: 8.99 },
      { title: 'The Lord of the Rings', author: 'J. R. R. Tolkien', price: 22.99 }
    ]
  }
};

// Values: query(document, path) returns the matched values directly.
const titles = query(document, '$.store.book[*].title');
// → ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']

// Filter: books cheaper than 10.
const cheap = query(document, '$.store.book[?(@.price < 10)].title');
// → ['Sayings of the Century', 'Moby Dick']

// Normalized paths: paths(document, path) returns where each match lives.
const authorPaths = paths(document, '$..author');
// → ["$['store']['book'][0]['author']", "$['store']['book'][1]['author']", ...]

// RFC 9535 functions like length() are used INSIDE filters, not as a segment.
const longTitles = query(document, '$.store.book[?length(@.title) > 15]');
// → the two books whose title is longer than 15 characters

核心功能

RFC 9535 标准引擎(无 eval)

默认引擎实现 RFC 9535,即 IETF 2024 年的 JSONPath 正式规范 —— 精确语法、规范化路径,以及五个标准函数。它零依赖且不使用任何 eval,因此用自己的语法解析并解释表达式,而非把它们编译成 JavaScript。它可在严格的内容安全策略下运行。

经典 (Goessner) 兼容模式

一次切换即可换到兼容 Goessner 的引擎(基于 jsonpath-plus,构建时禁用了 eval),让从 jsonpath.com 等旧工具复制来的表达式表现得与你在那里看到的一致。在 RFC 9535 与经典之间切换,以比较结果并诊断某条路径为何在不同方言中匹配不同。

三种结果视图:Values、Paths、Both

Values 把匹配节点渲染为 JSON 数组,正是你在代码中会使用的形式。Paths 渲染每条匹配的规范化路径,如 $['store']['book'][0]['title']。Both 把两者并排显示,让你把每个值映射到它的精确位置。当前视图会跨会话保留。

为每条匹配生成规范化路径

每条结果都带有其规范的、用方括号加引号的规范化路径 —— 这是 RFC 9535 唯一标识节点位置的方式,无论表达式是怎么写的。命中同一节点的两个表达式会产生相同的规范化路径,这让调试含糊的查询变得简单直接。

完整的选择器支持

根 $、当前元素 @、子项 .name、递归下降 ..name、通配符 [*]、数组索引 [0]、切片 [start:end:step]、并集 [a,b],以及带比较和逻辑运算符的过滤器 [?()] 表达式。内置速查表记录了每个选择器,让你无需离开页面就能查阅。

RFC 9535 函数扩展

在表达式内部调用 length()、count()、match()、search() 和 value() —— 统计数组的元素数、用 I-Regexp 模式测试字符串,或按嵌套列表的大小过滤。这些标准函数在默认引擎中可用;如果你在经典模式下调用它们,工具会提示你切换引擎。

格式化、上传与示例

「格式化 JSON」会美化你的输入,让结构在查询前清晰可读。「上传」完全在浏览器中读取 .json 或 .txt 文件 —— 它绝不会发送到任何地方。「示例」下拉菜单针对示例数据加载已知可用的起始表达式,让你在改写路径前先看到引擎在工作。

永久链接分享(无上传)

「复制链接」把 JSON、表达式、引擎和视图编码进 URL hash。浏览器绝不会在请求中传输 URL 片段,所以分享的链接会在接收方的机器上重现你的完整状态,而不触及 go-tools.org 服务器。自包含,且对协作调试友好、可审计。

100% 私密,仅在浏览器中

你的 JSON 和表达式绝不离开你的设备。没有网络请求、没有日志、没有对你输入内容的分析 —— 可在 DevTools → Network 中验证。只有引擎和视图偏好会持久化到 localStorage。可安全用于专有负载、脱敏日志,以及任何你不愿粘贴到 jsonpath.com 的数据。

实战示例

从书店文档中选取每本书的标题

$.store.book[*].title
["Sayings of the Century", "Sword of Honour", "Moby Dick", "The Lord of the Rings"]

粘贴经典的 Goessner 书店 JSON,输入该表达式,Values 视图就会返回包含全部四个标题的 JSON 数组。切换到 Paths 即可看到每条结果对应的规范化路径,如 $['store']['book'][0]['title']。通配符 [*] 会遍历 book 数组的每个元素;.title 则从每个元素中投影出一个成员。

用过滤表达式筛选价格低于 10 的书

$.store.book[?(@.price < 10)].title
["Sayings of the Century", "Moby Dick"]

过滤选择器 [?()] 只保留谓词为真的数组元素;@ 表示当前元素。对书店数据(价格 8.95、12.99、8.99、22.99)求值时有两本书符合条件。两个引擎都接受这种写法,但请注意经典 (Goessner) 会把同样的过滤器写成 [?(@.price<10)] —— 如果你从旧工具复制了表达式,记得切换引擎。

用递归下降遍历整棵树

$..author
["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J. R. R. Tolkien"]

.. 运算符会下降到文档的每一层,收集出现在任何位置的 author 成员,无论嵌套有多深。递归下降是从深度嵌套或结构不规则的数据中提取某个字段最快的方式,无需写出完整路径。

用 [start:end:step] 对数组切片

$.store.book[0:2].title
["Sayings of the Century", "Sword of Honour"]

数组切片遵循与 Python、JavaScript 相同的半开区间 [start:end] 约定:从索引 0 到(但不含)索引 2,返回前两本书。再加第三个字段即为步长 —— $.store.book[::2] 会取每隔一个的元素。结束边界不包含在内,这是常见的差一陷阱,Paths 视图能让它一目了然。

用 RFC 9535 length() 函数按标题长度过滤

$.store.book[?length(@.title) > 15]
[{"title": "Sayings of the Century", "author": "Nigel Rees", "price": 8.95}, {"title": "The Lord of the Rings", "author": "J. R. R. Tolkien", "price": 22.99}]

length() 是 RFC 9535 五个标准函数之一,且只能用在过滤表达式 [?...] 内部 —— 绝不能作为独立的路径段使用,如 $.store.book.length(),RFC 9535 语法会拒绝这种写法(该段式写法是 jsonpath-plus 的扩展,并非标准 JSONPath)。这里过滤器保留标题长度超过 15 个字符的每本书;对书店数据求值时,标题超过 15 个字符的会被选中(例如 "Sayings of the Century" 和 "The Lord of the Rings"),而较短的如 "Moby Dick" 和 "Sword of Honour" 则被排除。count()、match()、search() 和 value() 同样在过滤器内部使用。这些函数是 RFC 9535 特性 —— 请切换到标准引擎(默认)才能使用;经典 (Goessner) 模式并未实现它们。

选取两个命名成员的并集

$.store.book[0]['title','author']
["Sayings of the Century", "Nigel Rees"]

并集选择器 [a,b] 在一个表达式里收集多个子项。这里它同时取出第一本书的 title 和 author。并集也适用于数组索引 —— [0,2] 会抓取第一个和第三个元素。Both 视图会把每个值与其规范化路径配对,让你清楚看到是哪个成员产生了哪条结果。

如何使用 JSONPath 测试工具

  1. 1

    粘贴或上传你的 JSON

    把 JSON 拖入输入框、粘贴进去,或点击「上传」从磁盘加载 .json / .txt 文件。「格式化 JSON」会重新缩进文档。非法 JSON 会在查询前以解析器消息内联标出。

  2. 2

    选择一个引擎

    RFC 9535(2024 年 IETF 标准,无 eval)为默认。当你运行从 jsonpath.com 等旧工具复制来的表达式时,切换到经典 (Goessner),结果就会与你在那里看到的一致。

  3. 3

    输入你的 JSONPath 表达式

    开头的 $ 已为你显示。可以从子路径如 .store.book[*].title、索引如 [0]、递归下降如 ..author,或过滤器如 [?(@.price < 10)] 开始。结果会随你输入实时更新。

  4. 4

    切换结果视图

    Values 显示匹配值的 JSON 数组。Paths 显示每条匹配的规范化路径,如 $['store']['book'][0]['title']。Both 把两者并排显示,让你把每个值映射到它在文档中的精确位置。

  5. 5

    复制结果或分享永久链接

    「复制结果」会把输出放到你的剪贴板。「复制链接」把 JSON、表达式、引擎和视图编码进 URL hash(无上传),让同事能在自己的机器上本地重现完全一样的查询。

常见 JSONPath 错误

忘了开头的 $ 根

每个 JSONPath 表达式都从根开始,写作 $。省略它(或把路径写成 $ 是隐式的样子)会让大多数引擎拒绝该表达式。测试工具已为你显示 $,所以请从下一个选择器开始输入 —— 一个点、一个方括号,或一个递归下降。

✗ 错误
store.book[*].title  →  invalid (no root)
✓ 正确
$.store.book[*].title  →  selects every title

差一切片 —— 以为结束索引被包含

切片是半开区间:[start:end] 取到但不含 end。[0:2] 返回两个元素(索引 0 和 1),而非三个。要按索引包含最后一个元素,请用 [start:] 或把结束边界往后推一位。

✗ 错误
$.store.book[0:2]  →  first TWO books, not three
✓ 正确
$.store.book[0:3]  →  first three books (indices 0,1,2)

在 RFC 9535 引擎中使用了经典表达式(或反之)

从 jsonpath.com 或 jsonpath-plus 复制来的表达式,因过滤器、并集和函数差异,在 RFC 9535 下可能解析或匹配不同。如果结果看起来不对,请把引擎开关切换到该表达式所针对的方言。

✗ 错误
Classic filter run under RFC 9535  →  parse error or unexpected nodes
✓ 正确
Switch engine to Classic (Goessner)  →  reproduces the original result

把 RFC 9535 函数当作独立段调用

length()、count()、match()、search() 和 value() 是 RFC 9535 函数扩展,只能在过滤器 [?...] 内部有效。像 $.store.book.length() 这样的独立段调用会被 RFC 9535 语法拒绝(它是 jsonpath-plus 的扩展,并非标准)。请在过滤器内部调用函数,并使用默认的 RFC 9535 引擎 —— 经典 (Goessner) 引擎并未实现这些函数。

✗ 错误
$.store.book.length()  →  parse error (not a valid RFC 9535 segment)
✓ 正确
$.store.book[?length(@.title) > 15]  →  books with a title over 15 chars

在过滤表达式中忘了 @

在过滤器 [?()] 内部,当前元素是 @,不是 $。写 $.price 指回的是文档根,而非被测试的元素,所以过滤器会选不到任何东西、或选中所有东西。用 @ 来定位被过滤元素的成员。

✗ 错误
$.store.book[?($.price < 10)]  →  wrong scope
✓ 正确
$.store.book[?(@.price < 10)]  →  books under 10

用错误的语法给成员名加引号

方括号表示法需要在字符串键周围加引号:$['store'] 或 $.store 都可用,但 $[store](方括号内不加引号)是索引/标识符错误。对任何含空格、点号或特殊字符的键,请在方括号内使用引号:$['first name']。

✗ 错误
$[store][book]  →  invalid bracket selectors
✓ 正确
$['store']['book']  →  same as $.store.book

以为递归下降会在第一层停下

$..author 不会在顶层停下 —— 它会收集每一层、每个深度的每个 author 成员。如果你只想要直接子项,请写出完整路径。在大文档上做递归下降可能返回远超预期的节点。

✗ 错误
$..price  →  every price anywhere in the tree
✓ 正确
$.store.book[*].price  →  only book prices

谁会使用本工具

从 API 响应中提取字段
无需编写遍历代码即可从 JSON 负载中提取请求 ID、嵌套资源属性,或一组名称。在这里针对示例响应构建路径,在 Values 视图中确认它精确返回了你想要的节点,然后把验证过的表达式粘贴进你的应用或测试。
为集成测试编写断言
许多测试框架和契约测试工具(REST Assured、Karate、Postman)使用 JSONPath 对响应体做断言。在这里起草断言路径,针对真实响应验证它选中了正确的节点,再复制进你的测试 —— 在测试套件变红之前就抓住错误路径。
在流水线中配置数据转换
Kubernetes、AWS Step Functions、Azure Logic Apps 及许多 ETL 工具接受 JSONPath 来定位事件负载中的字段。在这里针对一个有代表性的事件原型化确切路径,确认它能解析,再放心地放进你的流水线配置,确信它指向你预期的位置。
私密地重现 jsonpath.com 的结果
手头有来自依赖服务器的求值器的表达式,却不能把数据粘贴到第三方网站?切换到经典 (Goessner) 模式,加载你的 JSON,在本地重现相同结果 —— 负载绝不离开你的浏览器,专有数据始终留在你的机器上。
把旧表达式迁移到 RFC 9535
正在迁移到一个声称兼容 RFC 9535 的系统?在经典模式下运行一条旧表达式,然后切到 RFC 9535 引擎,看它是否仍能解析并匹配相同节点。双引擎对比能精确定位你原本会在生产中遇到的过滤器、并集和函数差异。
调试路径为何返回了错误的节点
一条选中过多或过少的路径,仅凭值很难推理。切换到 Paths 视图,查看每条匹配的规范化位置 —— 确切的数组索引、确切的成员链 —— 那个差一切片或多余的递归下降会立刻变得显而易见。
教学或评审 JSONPath
针对示例数据打开一条可用表达式,逐个选择器走读,在 Values 与 Paths 之间切换,让学习者既看到选中了什么、也看到它在哪里。速查表和已演练的示例为代码评审或新人入职提供了结构化参考。

引擎与算法说明

RFC 9535 引擎(jsonpath-rfc9535,零依赖)
默认引擎直接实现 IETF RFC 9535 语法:它把表达式词法分析并解析为抽象语法树,再针对文档解释执行。整条路径中没有任何 eval、没有 Function 构造器,因此它对 eval 注入类漏洞免疫,并可在严格的内容安全策略下运行。
经典引擎(jsonpath-plus,已禁用 eval)
经典 (Goessner) 引擎是 jsonpath-plus,锁定在一个修补版本(>= 10.4.0),且构建时将 eval 选项显式设为 false。这在保持 Goessner 方言兼容的同时,关闭了被记录为 CVE-2024-21534 和 CVE-2025-1302 的远程代码执行向量 —— 它们影响了该库默认的基于 eval 的过滤路径。
规范化路径生成
每条匹配都以其 RFC 9535 规范化路径上报 —— 一种使用单引号方括号表示法($['store']['book'][0]['title'])、数组索引为裸整数的规范形式。规范化路径稳定且每个节点唯一,所以等价表达式会产生相同路径,而 Paths 与 Both 视图正依赖这一点来无歧义地标识结果。
按需加载的引擎分块
两个引擎都作为独立的 JavaScript 分块,仅在首次选中时加载,因此初始页面保持轻量,你不使用的引擎从不被下载。切换引擎会立即针对当前文档重新求值当前表达式,无需重新加载页面。
本地文件读取与 JSON 格式化
「上传」按钮使用浏览器 FileReader API 完全在客户端把 .json 或 .txt 文件读入输入框 —— 文件绝不会被传输。「格式化 JSON」用两空格缩进解析并重新序列化输入,把解析错误内联呈现,让格式错误的 JSON 在求值前被抓住。
通过 URL hash 的永久链接(绝不传输)
分享状态被编码进 location.hash 片段,携带 JSON、表达式、当前引擎和结果视图。浏览器绝不会在 HTTP 请求中包含该片段,所以打开永久链接时 go-tools.org 服务器收到零数据;填充完全发生在接收方的设备上。

JSONPath 最佳实践

选择与你目标匹配的引擎
如果你的下游系统声称兼容 RFC 9535,就针对 RFC 9535 引擎编写并验证。如果你在重现或维护来自旧工具或旧库的表达式,请使用经典 (Goessner)。对照错误的方言验证,是表达式在测试工具中能用、却在生产中失败的最常见原因。
用 Paths 视图验证,而不只是看 Values
Values 视图告诉你匹配了什么;Paths 视图告诉你在哪里。当一个查询返回看起来正确的值时,它仍可能是从错误的位置选中它们的 —— 一个多余的递归下降或一个过宽的通配符。检查规范化路径,确认表达式精确命中了你预期的节点。
留意切片不包含的结束边界
[0:2] 选取索引 0 和 1,而非 0 到 2 —— 结束边界不包含在内,正如 Python 和 JavaScript。差一切片错误是最常见的 JSONPath bug。用 Paths 视图读取每个被选元素的确切索引,在交付前确认边界。
能用显式路径时就别用递归下降
$..price 很方便,但会匹配文档中任何位置的每个 price,包括你并不想要的。当你了解结构时,写出完整路径($.store.book[*].price),让查询在数据增长时保持精确可预测。把 .. 留给真正不规则或未知的结构。
在过滤器中保持空白与引号一致
RFC 9535 对过滤表达式严格遵循其语法,而经典方言较为宽松。把过滤器写干净 —— 字符串字面量用单引号('fiction')、运算符两侧留空格、不要依赖宽松解析 —— 这样无论最终由哪个引擎或库运行,同一表达式都能求值一致。

常见问题

我的 JSON 或 JSONPath 表达式会被发送到你们的服务器吗?
不会。每次求值都在你浏览器内的 JavaScript 中运行。你的 JSON 文档和 JSONPath 表达式不会上传、不会记录、不会存盘,也不会发送给任何第三方。只有你的界面偏好 —— 当前引擎(RFC 9535 或 Classic)和结果视图(Values / Paths / Both)—— 会保存到 localStorage 以便页面下次记住;JSON 和表达式本身从不持久化。你可以打开 DevTools → Network 验证:在任一输入框中打字都不会触发任何请求。这使得本工具可以安全地处理专有 API 负载、脱敏的日志样本、内部配置,以及任何你不愿粘贴到 jsonpath.com 这类依赖服务器的求值器中的内容。
什么是 JSONPath,它有什么用?
JSONPath 是面向 JSON 的查询语言,正如 XPath 是面向 XML 的查询语言。你写一个路径表达式 —— 例如 $.store.book[*].author —— 求值器就会返回文档中该路径选中的每一个值。它用于从 API 响应中提取特定字段、在集成测试中对值做断言、在 Jenkins、Kubernetes、AWS Step Functions、Azure Logic Apps 等工具中配置数据转换,以及无需编写命令式遍历代码就能从庞大或不规则的 JSON 中提取数据。表达式由一组选择器构成:$(根)、. 或 [](子项访问)、..(递归下降)、*(通配符)、[start:end:step](数组切片)、[a,b](并集)和 [?()](过滤器)。本测试工具实时对表达式求值,同时展示匹配到的值及其规范化路径。
RFC 9535 和经典 Goessner 语法有什么区别?
经典 JSONPath 是 Stefan Goessner 于 2007 年发布的事实标准语法。它被广泛实现,却从未正式标准化,因此一些细微行为 —— 过滤器如何书写、并集与根函数如何工作、缺失值如何比较 —— 在各个库之间出现了分歧。RFC 9535 由 IETF 于 2024 年 2 月发布,是 JSONPath 的第一份正式规范。它确定了精确的语法、为结果定义了规范化路径,并增加了标准函数(length、count、match、search、value)。两者相近但不完全相同:RFC 9535 在过滤器的空白和引号方面更严格,为缺失成员定义了比较语义,并拒绝经典方言所容忍的一些宽松写法。本工具默认使用 RFC 9535 引擎(一个零依赖、零 eval 的实现),并允许你切换到经典 (Goessner) 引擎以保持向后兼容。
为什么同一个表达式在两个引擎中返回不同结果,以及如何使用从 jsonpath.com 复制来的表达式?
因为 RFC 9535 与经典 Goessner 方言在边界情况下确实有不同的规则 —— 过滤器的空白与引号、并集顺序、缺失成员如何比较,以及存在哪些函数。为某个引擎写的表达式在另一个引擎里可能匹配不同(甚至解析失败)。如果你从 jsonpath.com、jsonpath-plus 或基于 Jayway 的服务等旧工具复制了表达式,请把顶部的引擎开关切到经典 (Goessner):该模式运行的是兼容 Goessner 的求值器(基于 jsonpath-plus,构建时禁用了 eval),会重现你在源工具中看到的行为。如果你正在编写新表达式,或目标系统声称兼容 RFC 9535,请保留默认的 RFC 9535 引擎。速查表和内置示例的编写都确保在两个引擎中求值结果一致,让你有一个已知可用的起点。
过滤表达式 [?()] 是如何工作的?
过滤选择器只保留谓词为真的数组元素(或对象成员)。在过滤器内部,@ 指代正在测试的当前元素。$.store.book[?(@.price < 10)] 返回 price 成员小于 10 的每本书。你可以与字面量比较(@.isbn、@.category == 'fiction'),用 && 和 || 组合条件,测试成员是否存在(@.isbn 选取那些含有 isbn 的元素),并在 RFC 9535 中于谓词内使用函数扩展(?(length(@.tags) > 2))。比较运算符有 ==、!=、<、<=、>、>=。RFC 9535 对类型很精确:将缺失成员与某个值比较是良定义的,不会抛出异常。经典方言对空白更宽松,所以 [?(@.price<10)] 和 [?(@.price < 10)] 在那里都被接受;RFC 9535 则严格遵循其语法。
递归下降 (..) 有什么作用?
.. 运算符会搜索文档的每一层,而不只是直接子项。$..author 收集任何出现位置的每一个 author 成员 —— 顶层对象内、数组内、嵌套对象内,任意深度。当你不想(或无法)写出完整路径时,它是从深度嵌套或结构不规则的数据中提取字段最快的方式。你可以在 .. 后接任意选择器:$..book[*] 查找树中任何位置每个 book 数组的每个元素,$..* 枚举文档中的每一个值,$..['price'] 收集所有 price 成员。递归下降可能匹配大量结果 —— 切换到 Paths 视图,即可通过规范化路径精确看到每条结果来自何处。
RFC 9535 的 length()、count()、match()、search() 和 value() 函数是什么?
RFC 9535 定义了五个标准函数扩展,关键规则是它们只能在过滤表达式 [?...] 内部调用 —— 绝不能作为独立的路径段。写 $.store.book.length() 不是合法的 RFC 9535,标准语法会拒绝它(这种段式调用是 jsonpath-plus 的扩展,并非规范的一部分)。length() 返回字符串、数组或对象的长度,可用于按大小过滤:$.store.book[?length(@.title) > 15] 保留标题长度超过 15 个字符的书。count() 返回节点列表中的节点数量,同样在过滤器内使用:$.store.book[?(count(@.authors) > 1)]。match() 测试字符串是否与整个值匹配某个正则表达式,search() 测试字符串内部任意位置是否存在匹配 —— 两者都接受 I-Regexp 模式。value() 将单节点节点列表转换为其值,以便用于比较。这些函数是 RFC 9535 标准的一部分,因此在默认引擎中可用;经典 (Goessner) 引擎并未实现它们。如果某个基于函数的表达式失败,请确认你是在过滤器内部调用它,且引擎开关已设为 RFC 9535。
数组切片 [start:end:step] 是如何工作的?
切片使用与 Python、JavaScript 相同的半开区间约定:[start:end] 从索引 start 选取到(但不含)索引 end,所以 [0:2] 返回前两个元素(索引 0 和 1)。省略某个边界即可一直取到边缘 —— [2:] 从索引 2 开始往后,[:3] 取前三个。负索引从末尾倒数:[-1:] 选取最后一个元素。可选的第三个字段是步长 —— [::2] 取每隔一个的元素,[::-1] 反转(在支持负步长的引擎中)。结束边界不包含在内是最常见的切片错误;Paths 视图会显示每个被选元素的精确索引,让你一眼确认边界。
什么是并集选择器,如何一次选取多个键?
并集选择器在一对方括号内列出多个名称或索引,并收集它们全部:$['title','author'] 从对象中选取两个成员,$.store.book[0,2] 选取 book 数组的第一个和第三个元素。你可以把它与其他选择器混用 —— $.store.book[*]['title','price'] 取出每本书的 title 和 price。当你想要少数几个字段的固定投影、而非整个对象或通配符时,并集很方便。Both 视图是阅读并集结果最清晰的方式,因为它会把每个被选值与其规范化路径配对,让你分辨出哪个名称或索引产生了哪一条结果。
我可以通过链接分享 JSONPath 查询及其 JSON 吗?
可以 —— 而且该链接不涉及任何服务器往返。点击操作栏中的「复制链接」:测试工具会把 JSON、表达式、当前引擎和结果视图编码进 URL 的 hash 中。任何打开链接的人都会在本地、在自己的机器上以相同状态填充页面。由于数据存在于 hash 片段中,它绝不会被传输到 go-tools.org 服务器 —— 浏览器不会在 HTTP 请求中发送片段 —— 也绝不会出现在我们的访问日志里。链接长度随 JSON 大小增长,因此对于大文档,只分享表达式并让接收方粘贴自己的数据,或使用「上传」按钮在本地加载文件。这使得永久链接可以安全地用于协作调试,而不会把负载暴露给任何后端。
JSON 有大小上限吗?
求值受限于浏览器内存,而非硬性上限,但实际的最佳区间是几兆字节以内的文档 —— 远大于几乎任何单个 API 响应。带有宽泛选择器的超大数组(对数万个节点使用 $..* 递归通配符)会产生庞大的结果集,渲染较慢;请收窄表达式以保持输出可读。「上传」按钮会在浏览器中完整读取 .json 或 .txt 文件(绝不会发送到任何地方),「格式化 JSON」会重新缩进输入,让你在查询前先读懂结构。对于数兆字节的数据流水线,先在此对一个有代表性的片段验证表达式,再在你的应用代码或 jq 这类命令行工具中运行同样的路径。
它与 jsonpath.com 有何不同,是否安全 —— 真的没有 eval 吗?
四点不同。(1) 隐私:jsonpath.com 及大多数在线求值器在服务器上运行,或嵌入用 JavaScript eval 求值过滤器的库;本工具完全在你的浏览器中运行,且根本不使用 eval。默认的 RFC 9535 引擎是零依赖实现,没有任何 eval 路径;经典 (Goessner) 引擎基于 jsonpath-plus,锁定在显式禁用 eval 的修补版本上 —— 关闭了被记录为 CVE-2024-21534 和 CVE-2025-1302 的那类远程代码执行漏洞。这也意味着本工具能在严格的内容安全策略下工作。(2) 标准:这是为数不多提供真正 RFC 9535 引擎、而不仅是旧版 Goessner 方言的在线测试工具之一。(3) 双引擎:你可以在 RFC 9535 与经典之间切换,以并排比较结果或运行从旧工具复制来的表达式。(4) 语言:界面提供 15 种语言。如果你只需快速做旧语法检查,jsonpath.com 仍可用;但若要符合标准、私密、零 eval 的求值,本工具是更安全的选择。
Values、Paths 和 Both 视图分别显示什么?
JSONPath 查询的结果是一个节点列表 —— 你文档中的一组节点。Values 视图把这些节点渲染为匹配值的 JSON 数组,正是你在代码中会使用的形式。Paths 视图改为渲染每条匹配的规范化路径 —— 一种规范的、用方括号加引号的位置表示,如 $['store']['book'][0]['title'],无论你的表达式是怎么写的,它都能唯一标识该值在文档中的所在。规范化路径是 RFC 9535 的概念,对调试极为宝贵:选中同一节点的两个不同表达式会产生相同的规范化路径。Both 视图把两者并排显示,让你一眼把每个值对应到它的位置。你所选的视图会通过 localStorage 跨会话保留。
它能离线工作吗,以及内容安全策略方面如何?
两方面都可以。由于每次求值都在你的浏览器中运行、没有任何网络调用,页面加载完成后即使离线,本工具也会继续工作。又因为两个引擎都不使用 eval 或 Function 构造器来求值过滤表达式,本工具可以在禁止 unsafe-eval 的严格内容安全策略下运行 —— 许多注重安全的组织会强制执行该策略,而它会让基于 eval 的 JSONPath 库失效。RFC 9535 引擎用自己的语法解析并解释表达式,而不是把它们编译成 JavaScript;经典引擎则配置为禁用 eval。如果你需要在加固的内部环境中求值 JSONPath,本工具的设计就是为了在那里运行而无需任何策略例外。