正在加载,请稍候…

JSON 差异对比:如何比较两个 JSON 对象

比较两个 JSON 对象并高亮差异。了解 JSON 差异工具的工作原理及使用场景。

JSON 差异对比:如何比较两个 JSON 对象

什么是 JSON 差异对比?

JSON 差异对比是比较两个 JSON 文档以识别它们之间变化的过程。这在调试 API 响应、跟踪配置更改、审查数据迁移或调查数据随时间如何及何时变化时至关重要。

一个好的 JSON 差异工具超越了简单的文本比较——它理解 JSON 结构并显示有意义的语义差异。

JSON 差异对比:如何比较两个 JSON 对象 插图

JSON 变化的类型

比较两个 JSON 文档时,变化分为四类:

新增:新版本中存在但旧版本中没有的键/值:

// 旧:  { "name": "Alice" }
// 新:  { "name": "Alice", "age": 30 }
// 差异: + "age": 30

删除:旧版本中存在但新版本中没有的键/值:

// 旧:  { "name": "Alice", "status": "pending" }
// 新:  { "name": "Alice" }
// 差异: - "status": "pending"

修改:两个版本中都存在但值不同的键:

// 旧:  { "count": 10 }
// 新:  { "count": 15 }
// 差异: ~ "count": 10 -> 15

未变:两个版本中完全相同的键/值(通常在差异视图中隐藏)。

数组比较的挑战

数组比对象更难进行差异对比,因为项目没有固有的键。考虑:

// 旧: [1, 2, 3, 4]
// 新: [1, 3, 4, 5]

一个简单的比较可能会说位置 1、2、3 都发生了变化。更智能的差异对比会识别出元素 2 被删除,元素 5 被添加。

对于对象数组,选择什么作为匹配键很重要:

// 旧: [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
// 新: [{"id": 2, "name": "Bobby"}, {"id": 3, "name": "Charlie"}]

使用 id 作为键:Alice(1) 被删除,Bob(2) 重命名为 Bobby,Charlie(3) 被添加。

JSON 差异算法

JSON Merge Patch (RFC 7396) 格式紧凑地描述差异:

// 将旧版本转换为新版本的补丁
{
  "removed_field": null,    // null 表示删除
  "changed_field": "new_value",
  "new_field": "added_value"
  // 缺失的字段表示未变
}

JSON Patch (RFC 6902) 格式将差异描述为一系列操作:

[
  { "op": "remove", "path": "/removed_field" },
  { "op": "replace", "path": "/changed_field", "value": "new_value" },
  { "op": "add", "path": "/new_field", "value": "added_value" }
]

JSON Patch 支持以下操作:addremovereplacemovecopytest

JSON 差异对比:如何比较两个 JSON 对象 插图

实际使用场景

API 响应调试

当 API 响应意外变化时,比较两个连续的响应可以精确揭示变化内容。这在调试间歇性问题时尤其有价值。

配置管理

比较不同环境(开发、预发布、生产)之间的配置文件有助于识别特定环境的差异。

JSON 差异对比:如何比较两个 JSON 对象 插图

数据库迁移验证

数据迁移后,比较迁移前后的 JSON 导出可以验证迁移是否正确转换了数据。

代码审查

使用结构差异工具审查 JSON schema 文件或示例 API 响应的更改会变得更加清晰。

使用此工具

在并排编辑器中粘贴两个 JSON 文档。该工具:

  • 验证两个文档是否为有效 JSON
  • 使用颜色编码显示结构差异(绿色=新增,红色=删除,黄色=修改)
  • 处理嵌套对象和数组
  • 提供可视化差异和 JSON Patch 输出

-> 尝试 JSON 差异工具