JSON 结构化差异对比

按结构而不是按文本比较两份 JSON 文档

结构化比较:忽略键顺序和缩进
原始 JSON
改动后的 JSON
差异
在两侧都粘贴 JSON 以进行比较。

工具说明

关于 JSON 结构化差异对比

JSON diff 工具按结构而不是按文本比较两份文档,让你看到的是数据变了什么,而不是格式变了什么。

一边粘原始 JSON,另一边粘修改后的 JSON,比较结果立刻更新成一张表,列出新增、删除和变更的值,以及每一项所在的路径。

JSON Diff 工具怎么用

  1. 把原始文档粘进第一个输入框,修改后的文档粘进第二个。
  2. 看顶部以 +N -N ~N 形式给出的汇总计数,先掌握改动的规模。
  3. 浏览结果表:变更类型、路径、变更前的值、变更后的值。
  4. 顺着 a.b[2] 这样的路径回到源文件里找:键之间用点连接,数组用下标表示。

什么时候用得上

  • 比较两套环境的配置,例如预发的 JSON 配置对生产的那份。
  • 在依赖新结构之前,先看清某个服务两个版本之间 API 响应有什么变化。
  • 查清 package-lock.json 或其他自动生成的依赖清单里究竟动了什么。
  • 确认某个工具重新序列化基础设施即代码文件或 Kubernetes 清单之后改了哪些内容。

路径和变更类型是怎么表示的

每一行都指向文档中的一个位置,写法与你在代码里读取这个值的方式一致,方便回到源文件里定位。

  • 新增:该路径只存在于修改后的文档,变更后一列显示新值。
  • 删除:该路径只存在于原始文档,变更前一列显示原来的内容。
  • 变更:两边都存在该路径但值不同,因此两列都会填上。
  • a.b[2] 这样的路径表示对象 a 里的键 b,再取该数组下标为 2 的元素。

JSON 对比常见问题

为什么重新格式化文件之后没有任何差异?
因为两边都先做了解析。缩进、键顺序和换行符都不属于解析后的结构,所以永远不会作为差异出现。
为什么往数组里插一个元素,后面全被标成变更了?
数组是按下标比较的。插入会让后面每个元素都移到新位置,于是每个移位的位置都被报成变更。这是按位置比较的固有局限,不是缺陷。
如果有一边不是合法 JSON 会怎样?
两边输入都必须解析成功。任意一边格式有误时,会显示解析错误而不是比较结果。
两份文档完全一致时会显示什么?
工具会明确说明不存在结构性差异,而不是留一片空结果让人误以为失败了。
我的数据会被上传吗?
不会。解析和比较都在你的浏览器里用 microdiff 库本地完成,你粘贴的内容不会发往 wetool.site 或任何其他服务器。

JSON diff 与纯文本 diff 的区别

文本 diff 比较的是一行行字符,于是调换键顺序、缩进从两空格改成四空格、换行符不同,都会显示成差异,哪怕数据完全相同,真正的改动反而淹没在这些噪声里。JSON diff 先解析两份文档,只报告语义上的差异,键顺序和格式一律忽略。字节层面要精确对齐时用文本 diff,只关心数据时用这个。

读结果时别被误导

结构比较精确地回答了一个很窄的问题,所以有必要知道这张表能说明什么、不能说明什么。

  • 一大串变更集中在同一个数组里,通常意味着一次插入或一次重排,而不是许多处彼此独立的编辑。
  • 类型是有区别的:字符串 1 和数字 1 是不同的值,会被报成一处变更。