比较 JSON 文档对于调试 API、测试、版本控制和配置管理至关重要。
为什么需要比较 JSON?
简单相等检查
// 快速方法
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;
}
使用差异库
生产环境建议使用这些库:
JSON Patch (RFC 6902)
标准补丁操作:
[
{ "op": "replace", "path": "/name", "value": "新名称" },
{ "op": "add", "path": "/email", "value": "test@example.com" },
{ "op": "remove", "path": "/temp" }
]
使用我们的 JSON 验证器 确保差异输出是有效的 JSON。