Skip to content
data2026-07-252 分钟阅读

什么是 JSON Diff

JSON Diff 是比较两个 JSON 数据结构并找出差异的过程。它能识别出两个 JSON 对象之间的新增、删除和修改。

比较示例

原始 JSON:

{
  "name": "张三",
  "age": 28,
  "hobbies": ["reading", "gaming"]
}

修改后的 JSON:

{
  "name": "张三",
  "age": 29,
  "hobbies": ["reading", "coding"],
  "email": "zhang@example.com"
}

Diff 结果:

{
  "age": { "old": 28, "new": 29 },
  "hobbies[1]": { "old": "gaming", "new": "coding" },
  "email": { "added": "zhang@example.com" }
}

为什么需要 JSON Diff

  1. API 响应验证:比较 API 返回值与预期值
  2. 配置变更检测:对比配置文件的修改
  3. 数据迁移验证:确认数据迁移的正确性
  4. 代码审查:比较两个版本的 JSON 输出
  5. 自动化测试:在测试中断言数据变化
  6. 版本控制:追踪 JSON 数据的变更历史

Diff 结果类型

| 变更类型 | 说明 | 标识 | |---------|------|------| | 新增 | 键不存在于原始 JSON | +added | | 删除 | 键存在于原始但不在修改后 | -deleted | | 修改 | 键存在但值不同 | ~changed | | 未变 | 键和值都相同 | 无标记 |

如何使用在线工具

使用 DevToolkit Pro 的 JSON Diff 工具

  1. 在左侧输入原始 JSON
  2. 在右侧输入修改后的 JSON
  3. 工具自动比较并高亮显示差异
  4. 显示新增、删除、修改的具体内容
  5. 支持复制 Diff 结果

代码中的 JSON Diff

JavaScript

// 深度比较两个对象
function deepDiff(oldObj, newObj, path = '') {
  const diffs = {};
  const allKeys = new Set([...Object.keys(oldObj), ...Object.keys(newObj)]);

  for (const key of allKeys) {
    const currentPath = path ? `${path}.${key}` : key;

    if (!(key in oldObj)) {
      diffs[currentPath] = { type: 'added', value: newObj[key] };
    } else if (!(key in newObj)) {
      diffs[currentPath] = { type: 'deleted', value: oldObj[key] };
    } else if (typeof oldObj[key] === 'object' && typeof newObj[key] === 'object') {
      Object.assign(diffs, deepDiff(oldObj[key], newObj[key], currentPath));
    } else if (oldObj[key] !== newObj[key]) {
      diffs[currentPath] = { type: 'changed', old: oldObj[key], new: newObj[key] };
    }
  }

  return diffs;
}

Python

def deep_diff(old, new, path=''):
    diffs = {}
    all_keys = set(list(old.keys()) + list(new.keys()))

    for key in all_keys:
        current_path = f"{path}.{key}" if path else key

        if key not in old:
            diffs[current_path] = {'type': 'added', 'value': new[key]}
        elif key not in new:
            diffs[current_path] = {'type': 'deleted', 'value': old[key]}
        elif isinstance(old[key], dict) and isinstance(new[key], dict):
            diffs.update(deep_diff(old[key], new[key], current_path))
        elif old[key] != new[key]:
            diffs[current_path] = {'type': 'changed', 'old': old[key], 'new': new[key]}

    return diffs

FAQ

JSON Diff 能处理大文件吗?

取决于工具实现。简单的内存比较对大文件(>10MB)可能较慢。推荐使用流式 Diff 算法或专门的库(如 deep-diffjsondiffpatch)。

Diff 结果可以合并吗?

有些工具支持「合并」功能,将 Diff 结果应用到原始 JSON 上。但这需要 Diff 结果包含完整的变更信息(旧值和新值)。

数组顺序变化怎么处理?

数组 Diff 有两种策略:按位置比较(简单但可能不准确)和按内容比较(更智能但更复杂)。选择取决于你的使用场景。


本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页


ad