什么是 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
- API 响应验证:比较 API 返回值与预期值
- 配置变更检测:对比配置文件的修改
- 数据迁移验证:确认数据迁移的正确性
- 代码审查:比较两个版本的 JSON 输出
- 自动化测试:在测试中断言数据变化
- 版本控制:追踪 JSON 数据的变更历史
Diff 结果类型
| 变更类型 | 说明 | 标识 |
|---------|------|------|
| 新增 | 键不存在于原始 JSON | + 或 added |
| 删除 | 键存在于原始但不在修改后 | - 或 deleted |
| 修改 | 键存在但值不同 | ~ 或 changed |
| 未变 | 键和值都相同 | 无标记 |
如何使用在线工具
使用 DevToolkit Pro 的 JSON Diff 工具:
- 在左侧输入原始 JSON
- 在右侧输入修改后的 JSON
- 工具自动比较并高亮显示差异
- 显示新增、删除、修改的具体内容
- 支持复制 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-diff、jsondiffpatch)。
Diff 结果可以合并吗?
有些工具支持「合并」功能,将 Diff 结果应用到原始 JSON 上。但这需要 Diff 结果包含完整的变更信息(旧值和新值)。
数组顺序变化怎么处理?
数组 Diff 有两种策略:按位置比较(简单但可能不准确)和按内容比较(更智能但更复杂)。选择取决于你的使用场景。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。
相关文章
YAML JSON 转换完全指南:原理、工具与最佳实践
深入理解 YAML 和 JSON 的区别与联系,掌握 YAML JSON 双向转换的各种方法——在线工具、命令行、代码实现,以及常见陷阱和最佳实践。
在线 XML/JSON 转换器:数据格式互转工具
学习如何在 XML 和 JSON 格式之间转换数据。了解 XML 和 JSON 的特点差异,以及在 API 集成、配置管理和数据交换中的应用场景。
在线 Markdown 预览器:实时渲染和编辑 Markdown 文档
学习如何使用在线 Markdown 预览器实时渲染 Markdown 文档。了解 Markdown 语法、GFM 扩展、表格和代码高亮,以及在技术文档中的最佳实践。