JSON 与数据处理指南

JSON 对象合并:浅覆盖与递归规则

说明对象展开为何覆盖整个嵌套对象,在合并前明确数组、null 和删除规则。

Nav Tools ·

先观察浅覆盖

对象展开只复制顶层属性,后面的嵌套对象会整体替换前面的对象,不会保留后者缺失的子字段。

下面结果丢失 retries,用 JSON 对比可以直接看到字段消失。

const base={network:{timeout:10,retries:3}};
const override={network:{timeout:20}};
({...base,...override}) → {network:{timeout:20}}

递归合并需要明确规则

递归合并可能保留 retries 并修改 timeout,但不存在统一适合所有场景的深合并规则。

数组要拼接、替换还是按 ID 对齐,必须单独约定,不同选择会改变结果语义。

不要意外引入删除语义

JSON Merge Patch 用 null 删除对象成员,而配置协议可能需要真正保存 null。

只有明确采用该协议时才使用 Merge Patch;普通对象展开保留 null,不会删除属性。

测试引用共享与异常键

展开也只是浅拷贝,未替换的嵌套值仍可能与原对象共享引用。

处理不可信配置时校验允许的键,选用能安全处理原型相关名称的合并实现;文本格式化无法保证合并安全。

参考资料

← JSON 与数据处理指南