JSON Diff — 比较两个 JSON 文档
并排比较两个 JSON 文档,高亮新增、删除和修改的键。完全在浏览器中运行,无需上传、无限制。
比较两个 JSON 文档是那种听起来简单、实际并不简单的任务之一。基于行的 diff(diff 命令、VS Code 的源码 diff)把 JSON 当作文本看待,凡是变化的行都会被标记 —— 对压缩过的 JSON 来说,整篇文档都会被标红;对格式化过的 JSON 来说,所有包含变化值的行、以及因兄弟节点增减而缩进发生变化的行,都会被标出。结构化 diff 把 JSON 理解为数据,只标记真正的变化:这个 key 被添加了,那个 key 被删除了,这个值变了。结果是一份聚焦的差异列表,而不是铺天盖地的红绿行块。
不那么显而易见的决定是数组顺序。JSON 数组是有序列表,但顺序的语义在不同场景下含义不同。users 列表是顺序敏感的(顺序可能反映了排序或创建顺序)。博客文章的 tags 列表通常是顺序无关的(重要的只是标签集合本身,而不是分配的顺序)。默认 diff 把数组当作有序处理 —— [1, 2, 3] 和 [3, 2, 1] 被视为不同。对于集合式的数组(顺序在语义上不重要),「忽略数组顺序」开关是更合适的选择。
最后看交付场景:如果目的地是 code review,可视化 diff 就是产出物 —— 把结果或截图贴到 PR 描述里。如果目的地是 CI 流水线,JSON Patch(RFC 6902)是应输出的格式 —— 它把变更定义为一个操作列表(add、remove、replace、move、copy、test),任何兼容的库都能直接应用。如果目的地是数据迁移脚本,逐条路径的变更列表就是输入 —— 每条路径对应一条 column-to-update 语句或一次 document-to-revise 调用。
使用方法
粘贴两个 JSON 文档
把第一段 JSON 放入左侧面板,第二段放入右侧面板。diff 会随输入自动运行,新增、删除和修改会原地高亮。
选择 diff 模式
默认是结构化 diff(按 key 逐个比较,数组顺序敏感)。可切换到语义 diff(把 `{a:1,b:2}` 和 `{b:2,a:1}` 视为相等),或带类型严格比较的深度 diff。
阅读变更列表
变更列表面板把每处差异显示为路径:`users[3].email` 从 `[email protected]` 改为 `[email protected]`。点击路径可跳转到两侧源面板中的对应位置。
常见问题
数组顺序在 diff 中重要吗?
默认重要 —— `[1, 2, 3]` 和 `[3, 2, 1]` 被视为不同。切换「忽略数组顺序」后,数组会按集合比较,不同位置的相同元素被视为相等。适合字段顺序在语义上不重要的 API 响应 diff。
null 和 undefined 如何处理?
JSON 没有 `undefined`,只有 `null`。diff 把 `null` 和缺失的 key 视为不同 —— `{a: null}` 和 `{}` 并不相等。如果你的 schema 把它们视为等价,切换「把 null 和缺失视为相等」。
会检测值类型的变更吗?
会 —— 字符串变成数字,或对象变成数组,会被标记为类型变更而非单纯的值变更。diff 面板会在两侧显示类型,让变更含义一目了然。
能 diff 大文件吗?
可以 —— diff 在内存中运行,可处理到浏览器标签页可用内存上限的文件。几 MB 的 JSON 在解析时 UI 可能短暂卡顿,但 diff 本身很快(与文档大小线性相关)。对于超大文档,建议先预过滤出相关子集。
diff 前会格式化 JSON 吗?
会 —— 两个输入在 diff 前都会用一致的缩进美化输出。格式本身(2 空格还是 4 空格、key 顺序)不影响 diff 结果,只有值和结构起作用。
限制说明
- 不感知 JSON Schema 的语义diff 是结构性的,不感知 schema。在某个 JSON Schema 下语义等价的两个 JSON 值(例如带默认值的可选字段)会被标记为不同。需要 schema 感知的 diff 时,请用 JSON Schema 验证器做后处理。
- 对象的 key 顺序不视为 diff对象的 key 顺序会被忽略 —— `{a: 1, b: 2}` 和 `{b: 2, a: 1}` 被视为相等。diff 显示值的变化,不显示重排。如果 key 顺序重要(罕见,但部分遗留 API 中存在),请改用文本 diff 工具。
- 不输出 patch本工具以可视化方式展示 diff,但不输出 patch 文件(unified diff 格式、JSON Patch RFC 6902)。如需适合自动化的 patch 输出,请使用能输出 JSON Patch 的命令行工具。
平台说明
- macOS
- FileMerge 和 Kaleidoscope 是适用于任意文本文件的可视化 diff 工具。针对 JSON 这种结构化数据,浏览器工具更合适 —— 结构感知(按 key 逐一、数组顺序)比基于行的 diff 结果更清晰。
- Windows
- WinMerge 是 Windows 上标准的可视化 diff 工具。针对 JSON,浏览器工具更合适 —— 结构化 diff 只高亮真正变化的值,而不是包含它们的所有行。
- Linux
- 命令行场景下,`diff -u` 适用于任意文本文件,但它是基于行的、不感知结构。`jd`(JSON diff)和 `jsondiff` 是最接近的命令行等价物。浏览器工具更适合从聊天或邮件粘贴过来的 JSON 的交互式 diff。
- Web
- 完全在客户端运行。页面加载后即可离线使用。适合命令行工具不可用的受限环境下的临时 diff,或在浏览器标签页中捕获的 API 响应的快速对比。