应用前审计 IAM 策略变更
将当前的 aws iam get-policy-version 输出与提议的 JSON 粘贴对比,精确查看添加了哪些 Action 条目,或者是否有人在原本具体的声明中悄悄插入了 "Resource": "*"。AWS 控制台在保存时会重新排列声明,这使得 GitHub diff 具有误导性;在此处格式化两侧,真正的变更便一目了然。
粘贴、格式化并并排比较两个 JSON 片段。内置验证、美化输出和压缩功能。
一个免费的浏览器内工具,用于比较两个 JSON 文档。将旧版本粘贴到左侧,新版本粘贴到右侧,差异会逐字符高亮显示。数据不会离开您的机器。
验证使用浏览器原生的 JSON.parse。当您的 JSON 是一行压缩的巨型内容时,可以使用格式化按钮;反之有压缩按钮;还有实时验证,在输入时标记语法错误。
如果您曾在 GitHub PR 中盯着一个 6000 行的 openapi.json diff,试图找出导致下游客户端出错的那一个字段,这个工具能在几秒内帮您定位。
diff 在字符级别进行,然后通过语义后处理清理,使高亮落在有意义的片段上,而不是随机字符。插入内容在右侧窗格以绿色显示,删除内容在左侧以红色显示。
JSON 有一些规范中明确指出的特殊性。RFC 8259 中的 JSON 规范将对象定义为无序的,因此重新排列键在技术上不等于任何操作,但文本 diff 会将其标记出来。我们通过在每一侧提供格式化按钮来解决这个问题:两侧都格式化后再比较,顺序就一致了。对于更深层的结构性工作,可以参考 JSON Patch (RFC 6902) 或更简单的 JSON Merge Patch 格式 (RFC 7396),这是将 JSON 变更描述为数据的两种标准方式。
当顺序对哈希或签名很重要时,相关规范是 RFC 8785(JSON 规范化方案)。对键排序,规范化数字格式,然后再 diff。
两个文本窗格,一个 diff。无需注册,无需上传,无需服务器往返。
将旧 JSON 粘贴到左侧,新 JSON 粘贴到右侧。或者点击任意一侧的上传直接加载 .json 文件。如果想先看工具效果,可以点击示例按钮,两个窗格都会填充一个小示例。
点击每个窗格上的格式化,以两空格缩进进行美化输出。这会规范化空白和换行符,使 diff 突出显示实际数据变化而非格式差异。当您的 JSON 解析无误时,验证标记会变为绿色。
删除内容在左侧以红色高亮显示,插入内容在右侧以绿色高亮显示。滚动任意一侧,另一侧随之跟随。每个标题中的变更计数会告诉您 diff 找到了多少个不同的编辑。
将当前的 aws iam get-policy-version 输出与提议的 JSON 粘贴对比,精确查看添加了哪些 Action 条目,或者是否有人在原本具体的声明中悄悄插入了 "Resource": "*"。AWS 控制台在保存时会重新排列声明,这使得 GitHub diff 具有误导性;在此处格式化两侧,真正的变更便一目了然。
当 terraform show -json tfplan 返回一个 4 MB 的数据块时,用肉眼审查是徒劳的。将今天的计划与昨天的进行对比,找出某人在重构 PR 下添加的 aws_security_group_rule,或悄然消失的 lifecycle.ignore_changes 块。
当代码生成器按字母顺序重新排列 paths 时,6000 行的 openapi.json diff 完全不可读。格式化两侧,比较,真正的变更便会浮现:CreateOrderRequest 中添加的 required 字段,或 200 响应的 schema 悄悄从 string 变为 string | null。
解决 package-lock.json 冲突后,将您的解决文件与 main 的 lockfile 进行对比,以捕获传递性降级。npm 有时会在不同机器上将相同的 semver 范围解析为不同的确切版本,这正是"在我机器上可以运行,在 CI 中失败"的真正原因。阅读 package-lock.json 文档了解每个字段的含义。
从 staging 和 prod 分别拉取 GET /my-index/_mapping,将两者放入 diff。prod 可能在上个 sprint staging 已迁移到 "keyword" 的字段上仍然有 "type": "text",这就是为什么聚合查询在 prod 中不返回任何结果而在本地有效。映射嵌套五六层深,文本 diff 会把这淹没在噪音中。
当 Playwright 测试在本地通过而在 CI 中失败时,捕获测试实际看到的 JSON 响应体,并与仓库中的 fixture 进行对比。通常是没有人固定的 createdAt 时间戳或 traceId 字段,结构性 diff 会让出问题的键一目了然,而不是把您扔进一堵格式化文本的墙。
关于此工具最常暴露的解析边缘情况的简短速查表。所有内容均基于 JSON 规范。
| Topic | What this tool does |
|---|---|
| 对象键顺序 | 规范规定无序。{"a":1,"b":2} 等于 {"b":2,"a":1}。在 diff 前使用键排序进行规范化。 |
| 数组顺序 | 有序。[1,2,3] 不等于 [3,2,1]。如果您的用例中顺序无关紧要,请手动排序。 |
| 尾随逗号 | 不允许。{ "a": 1, } 是标准 JSON 的解析错误。JSON5/JSONC 作为超集允许,请先删除。 |
| 注释 | 不允许。// 如此 是解析错误。JSON5 和 JSONC 接受注释;本工具遵循严格的 RFC 8259 语法。 |
| 数字 | 解析为 64 位 IEEE 754 浮点数。0.1 + 0.2 = 0.30000000000000004。超过 2^53 − 1 的整数会失去精度;请将 snowflake ID 存储为字符串。 |
| 重复键 | 规范称之为未定义行为。大多数解析器保留最后一次出现的值。diff 会显示所有重复键,这通常是审计配置文件时您想要的。 |
| 编码 | 仅 UTF-8。RFC 8259 禁止文档开头出现 UTF-8 BOM;一些解析器仍然接受,但规范不允许。 |
| null 与缺失 | 值为 null 的键是存在的。缺失的键是不存在的。与 JavaScript 的 undefined 不同,后者在 JSON 中没有表示形式。 |
不会。diff 完全在您的浏览器中运行。没有任何内容被发送到服务器、记录或存储。粘贴内部 API 响应或 IAM 策略后关闭标签页,不会留下任何副本。如需验证,打开 DevTools,切换到网络标签,观察比较时是否有出站请求,答案是没有。
是的,两者都会。文本 diff 逐行比较字符,因此重新格式化、键重排或空白更改都会显示为差异,即使数据完全相同。先点击两个窗格上的格式化按钮,diff 就会专注于真正的数据变更。如果需要完全忽略键顺序的结构性比较,请在 diff 前对两侧的键进行排序。
对于对象键,不重要。JSON 规范规定对象是无序的,所以 {"a":1,"b":2} 和 {"b":2,"a":1} 表示相同的数据。字符 diff 仍会标记重排,这就是为什么格式化按钮很重要。数组则不同:[1,2,3] 和 [3,2,1] 不相等,因为数组顺序在 JSON 中是有意义的。
因为 IEEE 754 浮点数。0.1 + 0.2 实际上是 0.30000000000000004,而 JSON.parse 将数字读取为 64 位浮点数。大整数面临同样的限制:超过 2^53 - 1(9007199254740991)的数字会失去精度,因此 Twitter 风格的 snowflake ID 不能完整往返。如果精度很重要,请将其存储为字符串。
标准 JSON 两者都不允许。{ "a": 1, } 或 // 注释 会给您一个解析错误。那是 JSON5 或 JSONC(VS Code 用于 settings.json 的格式),它们是超集。请先删除注释和尾随逗号。我们有意遵循严格的 RFC 8259 语法,使 diff 与您的 API 实际接受的内容一致。
几 MB 以内没问题,低于一秒。超过 10 MB 浏览器开始感到压力,主要是因为渲染 diff(而非计算它)变得昂贵。对于 50 MB 以上的导出,先用 jq 将两侧过滤到您关心的子树,然后再粘贴。
因为 settings.json 和 tsconfig.json 是 JSONC,而不是严格的 JSON。JSONC 允许 // 行注释、/* 块注释 */ 和尾随逗号;严格 JSON 按 RFC 8259 三者都禁止。JSON5 更进一步,支持单引号字符串、无引号键和十六进制字面量。如果需要干净的 diff,请在粘贴前删除注释和尾随逗号。
在 diff 运行之前您可能就已经失去了精度。JSON 没有整数类型;所有数字都是 IEEE 754 双精度浮点数。超过 Number.MAX_SAFE_INTEGER(2^53 − 1 = 9,007,199,254,740,991)的数字在解析时会四舍五入到最近的可表示双精度数。Twitter snowflake ID、Discord snowflake 和 Stripe 对象 ID 都以引号字符串形式传输,正是出于这个原因。如果两侧都是有效的 JSON,精度损失在两侧是相同的,所以 diff 本身是可信的,但显示的值可能与源字节不符。
免费,无需注册。没有账户,没有试用期,比较次数也没有限制。粘贴两个 JSON 片段,diff 立即出现。没有任何功能藏在登录后面,复制和下载按钮会给您干净的输出,没有水印,没有注入的格式。
比较完全在您的浏览器中运行,所以您的 JSON 永远不会被上传。许多在线 JSON diff 网站会先将其 POST 到服务器,这在处理内部 API 响应或含有密钥的配置时是不可接受的。高亮是字符级的,带有语义清理,而不是整行,所以 200 行对象中一个值的变化很容易发现。还内置了格式化、压缩和实时验证。
可以。点击任意窗格上的上传,从磁盘直接选择 .json 文件,无需复制粘贴,将旧 package.json 加载到左侧,新版本加载到右侧。文件在浏览器中本地读取,永远不会发送到任何地方。点击两侧的格式化,diff 会忽略空白,只显示实际移动的依赖项行。
不能在一个视图中。它为两侧设计,原始版和修改版,因为这就是 diff 的本质。如果您有三个配置版本,请两两比较:staging 对 prod,然后 prod 对提议的更改。每对都给您一个清晰、专注的结果,而不是一个三方合并视图,那会掩盖哪个文件引入了某个键。
安全。解析、格式化和 diff 都在您的机器上进行,没有任何内容被上传、记录或存储。粘贴的 JWT、API 密钥或客户记录停留在标签页中,关闭时消失。如需确认,打开 DevTools,在比较时查看网络标签,您会看到零个携带您数据的出站请求。
您的 JSON 永远不会离开您的浏览器。解析器、格式化器和 diff 都在您的机器上本地运行。没有对您输入的分析,没有日志,没有"贴心的"云端往返。解析使用浏览器原生的 JSON.parse,我们遵循的 JSON 规范是 RFC 8259。