JSON 文档对比:差异工具和技术

jsondiffcomparisontesting

比较 JSON 文档对于调试 API、测试、版本控制和配置管理至关重要。

为什么需要比较 JSON?

  • API 测试 — 验证响应是否符合预期
  • 配置变更 — 跟踪部署之间的变化
  • 数据同步 — 检测本地和远程数据的差异
  • 调试 — 找出导致 bug 的变化
  • 简单相等检查

    // 快速方法

    JSON.stringify(obj1) === JSON.stringify(obj2)

    // 更好:排序键

    JSON.stringify(obj1, Object.keys(obj1).sort()) ===

    JSON.stringify(obj2, Object.keys(obj2).sort())

    这只能告诉你是否有差异,不能告诉你差异是什么。

    深度差异函数

    function deepDiff(obj1, obj2) {

    const diff = {};

    const allKeys = new Set([

    ...Object.keys(obj1),

    ...Object.keys(obj2)

    ]);

    for (const key of allKeys) {

    if (!(key in obj1)) {

    diff[key] = { added: obj2[key] };

    } else if (!(key in obj2)) {

    diff[key] = { removed: obj1[key] };

    } else if (JSON.stringify(obj1[key]) !== JSON.stringify(obj2[key])) {

    if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object') {

    diff[key] = deepDiff(obj1[key], obj2[key]);

    } else {

    diff[key] = { from: obj1[key], to: obj2[key] };

    }

    }

    }

    return diff;

    }

    使用差异库

    生产环境建议使用这些库:

  • deep-diff — 带路径信息的详细差异
  • jsondiff-patch — 带可视化输出的丰富差异
  • fast-json-patch — RFC 6902 JSON Patch 格式
  • JSON Patch (RFC 6902)

    标准补丁操作:

    [

    { "op": "replace", "path": "/name", "value": "新名称" },

    { "op": "add", "path": "/email", "value": "test@example.com" },

    { "op": "remove", "path": "/temp" }

    ]

    使用我们的 JSON 验证器 确保差异输出是有效的 JSON。

    相关工具