免费 JSONPath 测试工具 — 在线求值查询表达式
即时对任意 JSON 测试 JSONPath 表达式。内置 RFC 9535 标准引擎与经典 Goessner 模式,支持 Values / Paths / Both 视图、规范化路径、零 eval。100% 私密,全程在浏览器中运行,无需上传、无需注册。
什么是 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
粘贴或上传你的 JSON
把 JSON 拖入输入框、粘贴进去,或点击「上传」从磁盘加载 .json / .txt 文件。「格式化 JSON」会重新缩进文档。非法 JSON 会在查询前以解析器消息内联标出。
- 2
选择一个引擎
RFC 9535(2024 年 IETF 标准,无 eval)为默认。当你运行从 jsonpath.com 等旧工具复制来的表达式时,切换到经典 (Goessner),结果就会与你在那里看到的一致。
- 3
输入你的 JSONPath 表达式
开头的 $ 已为你显示。可以从子路径如 .store.book[*].title、索引如 [0]、递归下降如 ..author,或过滤器如 [?(@.price < 10)] 开始。结果会随你输入实时更新。
- 4
切换结果视图
Values 显示匹配值的 JSON 数组。Paths 显示每条匹配的规范化路径,如 $['store']['book'][0]['title']。Both 把两者并排显示,让你把每个值映射到它在文档中的精确位置。
- 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 表达式会被发送到你们的服务器吗?
什么是 JSONPath,它有什么用?
RFC 9535 和经典 Goessner 语法有什么区别?
为什么同一个表达式在两个引擎中返回不同结果,以及如何使用从 jsonpath.com 复制来的表达式?
过滤表达式 [?()] 是如何工作的?
递归下降 (..) 有什么作用?
RFC 9535 的 length()、count()、match()、search() 和 value() 函数是什么?
数组切片 [start:end:step] 是如何工作的?
什么是并集选择器,如何一次选取多个键?
我可以通过链接分享 JSONPath 查询及其 JSON 吗?
JSON 有大小上限吗?
它与 jsonpath.com 有何不同,是否安全 —— 真的没有 eval 吗?
Values、Paths 和 Both 视图分别显示什么?
它能离线工作吗,以及内容安全策略方面如何?
相关工具
查看所有工具 →Base64 解码与编码工具
编码和格式化
免费在线 Base64 解码编码工具。实时转换,支持中文和 Emoji,100% 浏览器端运行,数据不离开设备,无需注册。
Base64 转图片转换工具
编码和格式化
在浏览器中把 Base64 字符串或 data URI 解码还原为图片。预览、读取尺寸与 MIME,再下载为 PNG、JPG、GIF、SVG。无需上传。
CSV 转 JSON 转换器
编码和格式化
在浏览器中将 CSV 转换为 JSON。支持 RFC 4180、类型推断、表头行、大整数安全。100% 隐私,无需上传。
.env 转 JSON 转换器
编码和格式化
粘贴 .env 文件,立即得到 JSON。数据库密码、API 密钥和令牌绝不离开你的浏览器 — 100% 本地、零上传、免费的 dotenv 解析器。
HTML 转 Markdown 转换器
编码和格式化
在浏览器中将 HTML 转换为干净的 Markdown——支持 GFM 表格、任务列表和链接。可选 ATX/Setext 标题及内联或引用链接。非常适合迁移网页内容或喂给 LLM。100% 私密,无需上传。
图片转 Base64 转换工具
编码和格式化
在浏览器中将图片转换为 Base64 data URI——支持 PNG、JPG、GIF、WebP、SVG、ICO。一键复制 HTML、CSS、Markdown 和 JSON 输出。100% 私密,无需上传。