Command Palette

Search for a command to run...

JSONPath 测试器:无需编写循环即可查询任何 JSON

JSONPath 测试器:无需编写循环即可查询任何 JSON

T
Toolz Team
|Aug 23, 2026|14 最小读数

数据工具 合集的一部分

JSONPath 第一次写一个重要的表达式,在它工作之前我错了三次,我只知道它是错误的,因为我正在配置的 API 网关返回了一个空策略而不是我想要的字段,没有反馈循环,我会编辑表达式,重新部署,等待,一旦我开始在另一个选项卡中保持 JSONPath 测试仪打开,同样的工作花了两分钟而不是一个下午,这个指南是关于我如何使用 JSONPath 测试仪 toolz。dev 上,语法实际执行的操作,以及使表达式在确定它应该匹配时不会返回任何内容的小陷阱。

TL;博士: JSONPath 是 JSON 的查询语言,XPath 是 XML 的方式。 JSONPath 测试人员评估类似的表达式 $.store.book[*].author 针对文档并返回每个匹配值加上其路径。 JSONPath 测试仪 完全在浏览器中执行此操作,支持通配符、递归下降、切片、并集和过滤表达式,因此您可以在将查询粘贴到代码之前针对真实数据构建和调试查询。

什么是 JSONPath?

JSONPath 是用于选择 JSON 文档部分的一个紧凑语法,你写一个短路径,描述一条通过数据的路由,评估它返回该路由处的一个或多个值,这个想法来自 斯特凡·戈斯纳's 2007 年提案的,它故意镜像XPath,以便任何查询过XML的人都会有宾至如归的感觉多年来没有正式的规范,只有那篇文章和一系列大多同意的实现,并在2024年初IETF发布了 RFC 9535 确定语法。

JSONPath的遇见次数比你想象的要多,它是像邮差和空手道这样的API测试工具中的选择器语言,在库伯内特斯 kubectl 输出格式化、AWS CloudWatch 和 Step Functions、日志处理器以及数十个低代码平台中,用户需要从 Webhook 有效负载中拉出一个字段而不写代码。学习它一旦可以偿还所有这些费用。

Mental model简单,一个JSON文档就是树,对象有命名分支,数组有编号分支,叶子是你的标量值,一个JSONPath表达式是走那棵树的一组方向,结果就是你落地的每一片叶子或子树,它变得强大之处在于,单个表达式可以一次落地很多地方。

JSONPath 测试仪实际上是做什么的?

测试人员获取两个输入,即您的 JSON 和一个表达式,并向您显示表达式选择的每个节点。这听起来很明显,但值在反馈中。当表达式没有返回任何内容,或者返回的次数超过您的预期时,测试人员会将猜测游戏变成两秒检查,因为您可以准确地看到哪些节点匹配并一次调整一个字符。

Toolz。dev上流很短,粘贴JSON文档,或者加载大多数JSONPath教程使用的示例书店,键入表达式,并进行评估,工具用运行计数列出每个匹配的值,可以在三个视图之间切换输出值,仅给出结果作为JSON数组,路径给出每个匹配的标准化位置,这是发现实际需要的表达式的最快方法,条目将两者一起给出,因此您可以并排看到路径和值。

测试真实数据而不是在你的脑海中对其进行推理的原因是,来自野外的 JSON 比示例更混乱。字段有时是一个对象,有时是一个数组。您期望的键在一半的记录上缺失。一个数字以字符串形式到达。将表达式运行到实际有效负载上立即而不是在部署时间表面上出现这些惊喜。

如何从数组中选择项目?

数组是大多数 JSONPath 工作发生的地方,有四种方法可以解决它们。

单个索引选择一个元素。 $.store.book[0] return 第一本书,而 JSONPath 跟大多数语言一样,从零开始算,一个负索引从末尾开始算,所以 $.store.book[-1] 返回最后一本书,而无需知道有多少本。当您想要日志中的最新项目或提要中的最新条目时,该否定形式确实有用。

通配符选择每个元素。 $.store.book[*] 归还所有四本书,并且 $.store.book[*].author 返回每个的作者,为您提供干净的作者数组。通配符也适用于对象,其中 $.store.* 无论密钥如何,都会返回存储对象的每个值。

工会选择特定的集合。 $.store.book[0,2] 返回第一本书和第三本书,相同的逗号语法适用于名称,因此 $['store']['bicycle'] 括号引用的键可以让您寻址包含点形式无法提供的空格或标点符号的键。

A片选择范围,借用Python's start:end:step 形式。 $.store.book[:2] 取前两个, $.store.book[1:3] 采用中间范围,末端索引独占, $.store.book[::2] 取每秒一个元素,并且 $.store.book[::-1] array反转,slices是语法中最不为人所知的部分,也是一旦拥有它就可以保存最多类型的一个。

双点做什么?

双点是递归下降,正是这一特征使 JSONPath 感觉像是一条搜索而不是路径。 $..author 找到每一个 author key 在文档中的任何位置,无论它嵌套得有多深,并且 $..* 返回每个级别的每个值。当您不知道文档的确切形状时,或者当同一字段出现在多个深度时,递归下降会在一个表达式中找到所有这些值。

考虑样本书店。 $..price 返回五个值,四个书价和自行车价格,因为它下降到每个对象并收集每个对象 price 它发现。一个平原 $.store.book[*].price would只返回四种书价,因为它走的是固定的路线,那两种表述的区别就是在已知地点要价和在任何地方要价的区别。

递归下降的力量足以造成危险,从某种意义上说,它可以比你的意思更匹配。这正是测试人员在这里重要的原因。运行 $..name onfer an unfamiliar payload and you may discover it matched a user name, a product name, and a file name that you had no idea shared a key。seaing the paths in the outport tell you whether to narwe the expression before you life it。

过滤表达式如何工作?

过滤器仅保留条件为真的元素,并且它是写入的 [?(...)]@ 代表当前元素。 $.store.book[?(@.price < 10)] 退回书籍便宜十本。在过滤器内,您可以将字段与字面操作员进行比较 ==!=<<=>、和 >=测试场的存在,并将条件与 &&||

一些具体的例子使形状变得清晰:

  • $.store.book[?(@.category == "fiction")] 选择小说标题。
  • $.store.book[?(@.price < 10 && @.category == "fiction")] 缩小到廉价小说。
  • $.store.book[?(@.isbn)] 仅选择具有 ISBN 的书籍,使用存在而不是比较。
  • $.vals[?(@ > 2)] 过滤一个普通的数字数组,其中 @ on itself 指的是元素本身。

最常见的过滤错误是类型不匹配。在 JSON 中, "12"12 是不同的值,所以将数字字段与引用数字进行比较的过滤器,或者将字符串字段与裸数字进行比较的过滤器,默默地匹配任何内容,当过滤器让你感到惊讶时,首先要检查的是字段和字面是否是同类型,根据真实数据测试表达式,在那里你可以看到实际值,这是你如何在几秒钟内而不是在部署失败后抓住它。

JSONPath 与 JSON Pointer 与 JSON diff

JSON结构这三个工具都碰, 但是回答的问题不同, 挑错了浪费时间, 下面是他们比较的方式:

方法 答案 比赛 最好的
JSONPath 哪些节点满足此查询? 零、一或多 提取字段、过滤数组、探索未知形状
JSON 指针 (RFC 6901) 这个确切位置是什么? 总是完全是一个 引用单个固定字段,如 JSON 模式中所示 $ref
JSON 差异 两个文档之间发生了什么变化? 一组变化 比较相同数据的两个版本

JSON 指针,定义于 RFC 6901地址是一个精确的地方,具有斜线分隔的路径,例如 /store/book/0/title(wildcards) 或过滤器,而且它从不使用通配符或过滤器。当您需要明确地命名单个字段时,Reach for it。当单个表达式应该选择一组字段时,Reach for JSONPath。并且当您真正的问题是两个有效负载之间的差异而不是查询选择的内容时,a JSON 迪夫 是正确的工具,知道你真正需要的三项中的哪一项是战斗的一半。

为什么我的表情没有返回任何结果?

空结果几乎总是来自少数原因之一,测试人员可以让您快速排除它们。

第一个是结构不匹配。你写道 $.data.items.nameitems 是一个数组,所以你需要 $.data.items[*].name with a wildcard。点形式走进一个对象,而一个数组不是一个具有 a 的对象 name key,所以路径死结。将输出视图切换到路径,并一次一步步执行表达式,可以准确地显示它停止匹配的位置。

2个是拼写或外壳错误,JSON键是区分大小写的,所以 $.userId 不会匹配a userID field,而键名中的尾随空格或错别字会产生相同的静音 nothing。因为测试人员会向您显示表情旁边的文档,所以这些很快就能发现。

3个,如上面所涵盖的,是滤波器类型不匹配,其中一个数字比较与字符串值或反向运行。第4个是假设一个密钥存在于每个元素上,当它只存在于某些递归下降和存在滤波器是通常的补救措施。在每种情况下,修复都来自于观察表达式触及哪些节点,这正是测试人员的目的。

如果您按照我的方式构建堆栈,在 Laravel API、React 前端和偶尔的 shell 脚本之间移动,JSONPath 会出现在这三个脚本中,而永远不会上传数据的基于浏览器的测试器是我最接近的工具。我写了这样的实用程序如何适应更广泛的套件 web开发人员工具包并且保留这种工作客户端的情况是在 在线工具中的数据隐私 指南。

这与我的 JSON 工作流程的其余部分如何契合?

JSONPath 测试仪很少是唯一打开的工具,当我查询的 JSON 到达时,缩进最小化或缩进不一致,我通过 json格式化程序 首先,我可以在编写表达式时读取结构。格式化程序和测试程序一起是我如何从不可读的 API 响应到工作查询。

一旦我知道我关心哪些字段,下一步往往是重塑它们。如果我需要将选定的值输入电子表格或环境文件, JSON 扁平化器 将嵌套结构变成点符号键,其路径语法与 JSONPath 足够接近,以至于两者相互加强。如果我在 TypeScript 中为数据构建一个类型,则 json 打字稿 转换器生成接口,如果我需要验证形状而不是只读取它,则 JSON 模式生成器 产生一个我可以添加约束的模式。 JSONPath 是探索步骤;这些工具就是我用我发现的东西做的。

Privacy point值得重复,因为JSONPath工作如此频繁地发生在敏感数据上,API响应携带令牌,用户记录和内部ID,并将它们粘贴到服务器端工具中意味着信任其他人&#39;s日志。因为toolz。dev测试仪完全在浏览器中解析和评估,这些都不会离开你的机器,并且该工具一直在与网络断开连接。这就是你可以在暂存有效负载上使用的工具和你可以在真实事物上使用的工具之间的区别。

常见问题

JSONPath 有何用途?

JSONPath 用于选择和提取具有单一表达式的 JSON 文档的部分内容,它是 API 测试工具、Kubernetes 输出格式、AWS Step Functions 等云服务以及许多低代码平台中的查询语言,无论何时有人需要从 JSON 有效负载中拉出字段或过滤数组,而无需编写过程代码。

如何选择 JSONPath 中数组的每个元素?

使用通配符,所以 $.items[*] 返回项目数组的每个元素 $.items[*].id 返回每个的 id。您还可以按索引选择一个元素 with $.items[0]的,负指数的最后一个元素 $.items[-1]、具有类似并集的集合 $.items[0,2]或者具有类似切片的范围 $.items[1:3]

JSONPath 中的双点是什么意思?

双点是递归下降,它可以在任何深度进行搜索。 $..author 无论嵌套多么深,都可以在文档的任何位置找到每个作者密钥 $..* 返回每个级别的每个值。这是从文档中提取字段的最快方法,而文档的确切结构您事先并不知道。

JSONPath 中过滤表达式是如何工作的?

一个过滤器 [?(...)] 仅保留条件为真的元素 @ 参考当前元素。例如 $.book[?(@.price < 10)] 退货书籍比十本便宜,您可以将条件与 &&||的,如 [?(@.price < 10 && @.category == "fiction")]。你也可以测试一个字段&#39;s的存在与 [?(@.isbn)]

为什么我的 JSONPath 表达式什么也没返回?

2个最常见的原因是结构不匹配和类型不匹配,检查每个键是否存在,并用确切的外壳拼写,以及您使用的是通配符,其中数据是数组而不是对象,在过滤器中,记住&quot;12&quot;和12是不同的值,因此将字符串字段与引用值进行比较,将数字字段与裸数进行比较。

JSONPath 和 JSON Pointer 有什么区别?

JSON Pointer 寻址一个精确的位置,像/store/book/0/title,并且总是返回单个值,JSONPath 是一种查询语言,其中单个表达式可以通过通配符、递归下降和过滤器一次匹配多个节点,使用指针引用一个固定字段,JSONPath 选择一组字段或过滤集合。

我可以看到每场比赛的路径,而不仅仅是价值吗?

Yes。将输出模式切换到路径,得到每个匹配的标准化位置,或者将路径和值一起得到条目。看到真实的路径是完善表达式的最快方法,直到它准确选择您想要的节点,这对于递归下降尤其有帮助。

当我使用测试仪时,我的 JSON 是否已上传?

No。JavaScript的浏览器中解析文档并评估表达式,因此不会传输、记录或存储任何内容。您可以通过在运行查询时查看网络选项卡或断开与互联网的连接来确认它,因为一旦页面加载,测试人员就会保持离线工作。


免费尝试您自己的数据 JSONPath 测试仪。它完全在浏览器中评估通配符、递归下降、切片、并集和过滤表达式,上传任何内容。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!