什么是 JSON 对比?
JSON 对比会比较两个 JSON 文档并报告它们之间的差异。对 JSON 而言,普通的文本对比并不够用,因为同样的数据可以有多种写法:键的顺序不同、缩进不同、写成 1.0 而不是 1。结构化 JSON 对比会先解析两侧内容再比较数据,因此只报告读取该 JSON 的程序能察觉到的变化。本工具同时提供两种视图:一份变更路径列表(如 env.LOG_LEVEL),以及高亮显示改动词语的并排视图。
如何比较两个 JSON 文件
- 在左侧粘贴原始版本,在右侧粘贴修改后的版本,也可以在两侧分别打开或拖入文件。
- 比较会自动进行。比较结构(默认)忽略键顺序和格式;比较文本则按文件原文进行比较。
- 查看摘要和变更路径列表,然后滚动浏览并排视图,或用“上一处 / 下一处”在各处变更间跳转。
示例
比较下面两个服务定义(点击上方的“示例”即可加载):
{"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" |
| 修改 | replicas | 3 → 5 |
| 新增 | ports[2] | 9443 |
| 修改 | env.LOG_LEVEL | "info" → "debug" |
| 删除 | env.CACHE_TTL | 300 |
| 新增 | env.REGION | "eu-west-1" |
LOG_LEVEL 与 DB_POOL_SIZE 顺序互换并不会被报告,因为 JSON 对象是无序的。
比较原理
对象按键逐一比较。数组通过最长公共子序列进行对齐,因此插入或删除一个元素不会让后面的所有元素都显示为已修改;被修改(而非被替换)的元素会递归比较,从而得到 items[3].price 这样的路径。在并排视图中,两个文档都会按排序后的键和相同缩进输出,再用 Myers 对比算法(Git 默认使用的算法)逐行比较,并高亮每行中改动的词语。
任意一侧的 JSON 无效时,都会报告其所在行号;可以用 JSON 校验器修正,或切换到“比较文本”。YAML 文件请使用 YAML 对比,其他文本请使用文本对比。