使用方法
- 将原始 JSON 粘贴到左侧,将更改后的 JSON 粘贴到右侧,或尝试示例。
- 选择数组比较方式:按位置比较,或匹配相同项,以便插入项只报告一次。
- 以列表或并排方式查看差异。每项差异都有从根 ($) 开始的路径。
- 复制报告,粘贴到工单或代码审查中。
工作原理
两份文档都会作为数据而非文本进行解析和比较。对象会逐个键进行比较,因此键的顺序以及空格或缩进无关紧要。数字按值比较,因此 1 和 1.0 相等。
每处差异都有一个路径,写法类似 JSONPath 表达式:$ 表示根,.name 表示属性,[2] 表示数组索引,不是简单名称的键会加引号,例如 $["first-name"]。会报告四种差异:新增(仅出现在右侧)、移除(仅出现在左侧)、更改(类型相同,值不同)和类型更改(例如数字 44.9 变成了字符串 "44.90",或某个值变成了 null)。当整个对象或数组被新增或移除时,会在其自身路径报告一次,而不是每个字段报告一次。
默认情况下,数组按位置进行比较:第 0 项与第 0 项比较,第 1 项与第 1 项比较。如果在开头插入了一项,那么后面的每一项看起来都会发生变化。“匹配已移动的项”会先使用相等项的最长公共子序列来对齐两个数组,这样插入或删除只会报告一次,其余项则会配对。新增项使用其在右侧的索引,移除项使用其在左侧的索引。对于非常大的数组(超过约 200 万对项),会跳过匹配,改按位置进行比较。
列表中的键路径会在每个对象内按字母顺序排序。最多显示 2,000 处差异;复制的报告始终包含全部差异。
示例
检查 API 变更
比较同一订单昨天和今天的响应。差异显示 $.status 从 "pending" 变为 "shipped",$.total 的类型从数字变为字符串,$.coupon 被移除,$.customer.phone 为新增。
配置漂移
粘贴预发环境和生产环境的 JSON 配置。由于键顺序会被忽略,即使文件由不同工具保存,也只会显示真实差异,例如 $.cache.ttl 300 → 60。
包含插入项的列表
产品列表开头新增了一项。按位置比较时,每个产品看起来都变了;使用“匹配移动项”后,结果只有一条“新增 $[0]”。
常见问题
这与文本 diff 有何不同?
文本 diff 按行比较,因此键重新排序或重新格式化会显示为更改。此工具比较解析后的数据,因此只报告值、类型和结构上的差异。
为什么插入一项后数组会显示很多更改?
在“按位置”模式下,项按相同索引进行比较,插入一项会使后面的每一项都发生偏移。切换到“匹配移动项”可先对齐相同项。
“1” 和 1 是否会被视为相等?
不会。一个是字符串,另一个是数字,因此差异会报告为类型更改。类型相同的值会进行精确比较。
可以比较非常大的文件吗?
几 MB 的文件可以处理,但所有内容都在浏览器的内存中处理,因此非常大的文档在手机上可能会很慢。
隐私
两份文档仅在您的浏览器中解析和比较。不会上传、存储,也不会纳入分析。