JSON差异对比

比较两份JSON文档,按键路径清晰列出新增、删除和变化的键。递归遍历对象与数组,即使类型不一致也会作为变化列出。全部处理均在浏览器内完成,不会发送到服务器。

什么是JSON差异对比

JSON差异对比是将两份JSON数据按结构逐一核对,清楚显示哪些键被新增、哪些键被删除、哪些值发生了变化的过程。当API响应规格变更或不同环境的配置文件存在差异,仅凭肉眼通篇比对文本已经难以承受信息量时,这项功能尤其有用。本工具递归遍历对象与数组,按键路径提取差异,即使JSON嵌套很深,也能精准定位到具体变化的位置。

需要注意的前提是,如果JSON本身的结构存在问题,就无法进行差异计算。若存在逗号缺失、引号未闭合等语法错误,工具会明确提示是A还是B的输入有误,并作为错误显示,而不会尝试计算差异。此外,本工具采用两条不同的匹配规则:对象的键按名称匹配,数组的元素按索引(出现顺序)匹配。理解这一前提,有助于正确解读为什么某个键会被判定为"变化"而不是"新增"或"删除"。

JSON差异对比的使用方法

  1. 输入源JSON(A) 将JSON文本粘贴或直接输入到第一个输入框中。可以直接复制现有的配置文件或API响应,无需额外整理格式。
  2. 输入目标JSON(B) 将变更后或不同环境的JSON粘贴到另一个输入框中。A与B的输入顺序会影响结果中"删除""新增"的方向。
  3. 加载示例了解效果(可选) 点击"加载示例"按钮,两个输入框会自动填入包含新增、删除、变化的示例数据,方便立刻了解显示格式。
  4. 查看差异结果 删除、新增、变化的键会连同键路径一并列出。发生变化的键会并排显示变化前后的值,可以当场读懂差异内容。
  5. 按需清空输入内容 点击"清空"按钮可将两个输入框同时清空,开始比较另一组JSON数据。

用好本工具的小技巧

  • 键路径以`user.address[0].city`这样的点号/方括号形式显示,即使JSON嵌套很深,也能立刻定位到具体是哪一层的值发生了变化。
  • 数组按相同索引位置进行比较。请注意,仅仅调整数组元素的顺序也会被判定为所有元素都发生了变化。
  • 如果同一个键在一份文档中是字符串,在另一份中却是对象,这种类型不一致同样会被记录为变化,并原样显示两边的值。
  • 在比较部署前后的API响应时,建议先删除时间戳、请求ID等每次都会变化的字段,这样才能只关注真正需要留意的差异。
  • 即使JSON中存在大量未发生变化的值,工具也只统计一致的叶子节点数量,避免结果过长而难以浏览。

应用场景

检查API响应规格变更

在后端部署前后分别保存API响应,用本工具进行比较,可以及早发现意外的字段新增、删除或类型变化。

比较不同环境的配置文件

比较预发布环境与生产环境的config.json或package.json内容,排查环境变量遗漏或版本不一致的问题。

代码评审时说明差异

在评审JSON格式的迁移数据或架构定义时,可以直接分享差异列表,无需口头或在评论中逐条描述变更内容。

比较测试快照

将自动化测试输出的JSON快照与预期值进行比较,快速定位导致测试失败的具体字段。

核对外部对接数据

将Webhook接收到的负载与示例JSON进行比较,验证实际数据结构是否符合接口文档的规定。

术语表

键路径
以`user.address[0].city`这样的点号/方括号形式,表示从JSON根节点到某个具体值的路径的字符串。差异结果就是按这一单位显示的。
嵌套
对象或数组内部又包含对象或数组的状态。嵌套层级越深,仅凭肉眼比对就越困难。
叶子节点
在JSON树结构中不再向下分支的末端值(字符串、数字、布尔值或null)。差异对比最终就是逐一核对叶子节点的值。
类型不一致
同一键路径下的值,在一份文档中是字符串,在另一份中却是对象等不同数据类型的状态。本工具也会将其记录为"变化"。
语法错误
导致JSON.parse解析失败的格式错误文本。逗号缺失、引号未闭合是典型例子。
JSONPath
用于查询JSON内部值的一种查询语言规范。本工具的键路径写法,可以理解为JSONPath部分语法的简化版本。

常见问题

常用于比较部署前后的API响应,及时发现意外的变更,也可用于排查不同环境下配置文件(如config.json)之间的差异。相比人工逐行比对,直接提取差异能大幅缩短确认时间。

可以。对象的键是按名称进行匹配比较的,因此A和B中键的书写顺序不同并不影响差异检测结果。工具只关心每个键是否存在及其值是否一致,而不关心文本中的排列顺序。

数组是按索引(第0个、第1个……)进行匹配比较的,因此即使元素内容相同,只要顺序发生变化,对应索引位置的值就会被判定为"变化"。本工具不支持忽略顺序的数组比较。

不会。所有比较处理都在浏览器内的JavaScript中完成,输入内容不会被发送到任何服务器,即使响应中包含API密钥或个人信息,也可以放心比较。

如果JSON.parse解析失败,会明确提示A或B哪一方格式有误,并且不会进行差异计算。这有助于定位逗号缺失、引号未闭合等常见语法错误的位置。
工具君

闲话 ― CSV差异对比与JSON差异对比在键匹配思路上的不同

本站的CSV差异对比工具通过指定一个键列来识别行,并按行、按单元格进行比较。JSON并不具备行与列这种扁平结构,而是允许对象嵌套和数组这类层级结构,因此虽然同样叫"差异对比",底层的匹配算法却大不相同。本工具没有"键列"这个概念,而是使用从根节点递归遍历到叶子节点所构建的"键路径"作为比较的基本单位。

数组的处理是JSON差异检测中尤为棘手的部分。CSV的行可以通过键列的值唯一确定,而JSON数组元素并不保证具备任何标识符。本工具采用简单的按索引(出现顺序)匹配的方式,这种设计更适合关注对象结构或原始值的变化(例如配置文件或API响应的比较),而非适合追踪数组内容的增删。

在实际工作中,持续集成(CI)流程中自动检查REST API响应契约是否发生变化,也运用了类似的思路。本工具更看重在浏览器内即可完成的便捷性,但其思想与快照测试、契约测试(Contract Testing)是相通的——以机械化方式检测JSON结构差异,是软件开发各个环节中反复出现的课题。