JSON 与数据处理指南
JSON 对象合并:浅覆盖与递归规则
说明对象展开为何覆盖整个嵌套对象,在合并前明确数组、null 和删除规则。
先观察浅覆盖
对象展开只复制顶层属性,后面的嵌套对象会整体替换前面的对象,不会保留后者缺失的子字段。
下面结果丢失 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,不会删除属性。
测试引用共享与异常键
展开也只是浅拷贝,未替换的嵌套值仍可能与原对象共享引用。
处理不可信配置时校验允许的键,选用能安全处理原型相关名称的合并实现;文本格式化无法保证合并安全。