JSON差异对比
比较两份JSON文档,按键路径清晰列出新增、删除和变化的键。递归遍历对象与数组,即使类型不一致也会作为变化列出。全部处理均在浏览器内完成,不会发送到服务器。
使用技巧
- 键路径以`user.address[0].city`这样的点号/方括号形式显示,即使JSON嵌套很深,也能立刻定位到具体是哪一层的值发生了变化。
- 数组按相同索引位置进行比较。请注意,仅仅调整数组元素的顺序也会被判定为所有元素都发生了变化。
- 如果同一个键在一份文档中是字符串,在另一份中却是对象,这种类型不一致同样会被记录为变化,并原样显示两边的值。
- 在比较部署前后的API响应时,建议先删除时间戳、请求ID等每次都会变化的字段,这样才能只关注真正需要留意的差异。
- 即使JSON中存在大量未发生变化的值,工具也只统计一致的叶子节点数量,避免结果过长而难以浏览。
常见问题
常用于比较部署前后的API响应,及时发现意外的变更,也可用于排查不同环境下配置文件(如config.json)之间的差异。相比人工逐行比对,直接提取差异能大幅缩短确认时间。
可以。对象的键是按名称进行匹配比较的,因此A和B中键的书写顺序不同并不影响差异检测结果。工具只关心每个键是否存在及其值是否一致,而不关心文本中的排列顺序。
数组是按索引(第0个、第1个……)进行匹配比较的,因此即使元素内容相同,只要顺序发生变化,对应索引位置的值就会被判定为"变化"。本工具不支持忽略顺序的数组比较。
不会。所有比较处理都在浏览器内的JavaScript中完成,输入内容不会被发送到任何服务器,即使响应中包含API密钥或个人信息,也可以放心比较。
如果JSON.parse解析失败,会明确提示A或B哪一方格式有误,并且不会进行差异计算。这有助于定位逗号缺失、引号未闭合等常见语法错误的位置。
闲话 ― CSV差异对比与JSON差异对比在键匹配思路上的不同
本站的CSV差异对比工具(dev.csv.csv_diff)通过指定一个键列来识别行,并按行、按单元格进行比较。JSON并不具备行与列这种扁平结构,而是允许对象嵌套和数组这类层级结构,因此虽然同样叫"差异对比",底层的匹配算法却大不相同。本工具没有"键列"这个概念,而是使用从根节点递归遍历到叶子节点所构建的"键路径"作为比较的基本单位。
数组的处理是JSON差异检测中尤为棘手的部分。CSV的行可以通过键列的值唯一确定,而JSON数组元素并不保证具备任何标识符。本工具采用简单的按索引(出现顺序)匹配的方式,这种设计更适合关注对象结构或原始值的变化(例如配置文件或API响应的比较),而非适合追踪数组内容的增删。
在实际工作中,持续集成(CI)流程中自动检查REST API响应契约是否发生变化,也运用了类似的思路。本工具更看重在浏览器内即可完成的便捷性,但其思想与快照测试、契约测试(Contract Testing)是相通的——以机械化方式检测JSON结构差异,是软件开发各个环节中反复出现的课题。