JSON 对比工具

粘贴同一 JSON 文档的两个版本,逐路径、逐行查看具体改动。键顺序、缩进和数字写法都会被忽略,只显示真正的变化。

原始版本
修改版本

数据不会离开你的浏览器。快捷键:Ctrl/⌘ + Enter 执行主操作。

什么是 JSON 对比?

JSON 对比会比较两个 JSON 文档并报告它们之间的差异。对 JSON 而言,普通的文本对比并不够用,因为同样的数据可以有多种写法:键的顺序不同、缩进不同、写成 1.0 而不是 1。结构化 JSON 对比会先解析两侧内容再比较数据,因此只报告读取该 JSON 的程序能察觉到的变化。本工具同时提供两种视图:一份变更路径列表(如 env.LOG_LEVEL),以及高亮显示改动词语的并排视图。

如何比较两个 JSON 文件

  1. 在左侧粘贴原始版本,在右侧粘贴修改后的版本,也可以在两侧分别打开或拖入文件。
  2. 比较会自动进行。比较结构(默认)忽略键顺序和格式;比较文本则按文件原文进行比较。
  3. 查看摘要和变更路径列表,然后滚动浏览并排视图,或用“上一处 / 下一处”在各处变更间跳转。

示例

比较下面两个服务定义(点击上方的“示例”即可加载):

{"version": "2.4.1", "replicas": 3, "ports": [8080, 9090],
 "env": {"LOG_LEVEL": "info", "DB_POOL_SIZE": 20, "CACHE_TTL": 300}}

{"version": "2.5.0", "replicas": 5, "ports": [8080, 9090, 9443],
 "env": {"DB_POOL_SIZE": 20, "LOG_LEVEL": "debug", "REGION": "eu-west-1"}}

得到如下变更列表:

变更路径值
修改version"2.4.1" → "2.5.0"
修改replicas3 → 5
新增ports[2]9443
修改env.LOG_LEVEL"info" → "debug"
删除env.CACHE_TTL300
新增env.REGION"eu-west-1"

LOG_LEVEL 与 DB_POOL_SIZE 顺序互换并不会被报告,因为 JSON 对象是无序的。

比较原理

对象按键逐一比较。数组通过最长公共子序列进行对齐,因此插入或删除一个元素不会让后面的所有元素都显示为已修改;被修改(而非被替换)的元素会递归比较,从而得到 items[3].price 这样的路径。在并排视图中,两个文档都会按排序后的键和相同缩进输出,再用 Myers 对比算法(Git 默认使用的算法)逐行比较,并高亮每行中改动的词语。

任意一侧的 JSON 无效时,都会报告其所在行号;可以用 JSON 校验器修正,或切换到“比较文本”。YAML 文件请使用 YAML 对比,其他文本请使用文本对比。

JSON 对比常见问题

“比较结构”和“比较文本”有什么区别?

“比较结构”会解析两个文档并比较数据:键顺序、空白以及 1.0 与 1 这类写法差异都不计入,并给出变更路径列表。“比较文本”则按原文逐行比较文件,适用于格式本身也很重要的场景。

数组是如何比较的?

默认使用“匹配元素”:对比会找出最长的相同元素序列,因此在列表开头插入一个元素只会报告为一次新增,而不是所有元素都被修改。选择“按位置”则会将第 0 项与第 0 项、第 1 项与第 1 项依次比较。

“隐藏相同行”有什么作用?

大段未改动的行会折叠成一条“相同行”提示栏,每处变更周围保留三行上下文。点击提示栏可展开,取消勾选该选项则可查看两个文件的全部内容。

可以比较 JSON 和 YAML 吗?

可以,在结构模式下即可。两侧会分别识别格式,因此你可以检查一个 YAML 文件和一个 JSON 文件是否包含相同的数据。

有大小限制吗?

最大 25 MB 的文件都能正常打开。几 MB 的文件比较需要稍等片刻;如果两个文件差异极大,中间部分会显示为一整块替换内容,以保证页面流畅。

对比时会上传我的文件吗?

不会。两个文档都在你的浏览器中比较,绝不会发送到任何地方。