JSON 与数据处理指南

JSON Patch 与 Merge Patch:局部更新怎么选

比较顺序操作和对象合并,明确 null 删除、数组替换与路径转义规则。

Nav Tools ·

操作清单还是合并对象

JSON Patch 是有序操作数组,Merge Patch 是描述对象合并的文档,两者并非同一个协议。

需要数组位置或前置条件时可选 JSON Patch,简单对象更新且允许其 null 语义时可选 Merge Patch。

Document: {"name":"Ada","active":true}
JSON Patch: [{"op":"replace","path":"/active","value":false}]
Merge Patch: {"active":false}

Merge Patch 的 null 表示删除

Merge Patch 中,null 删除对象成员,而非把成员设为 JSON null;数组作为整体被替换。

业务需要显式 null 或逐个修改数组元素时,该格式可能不适合,应在接口设计前验证这些情况。

{"name":"Ada","note":"x"} + {"note":null}
→ {"name":"Ada"}

正确转义 JSON Pointer 路径

Patch 路径采用 JSON Pointer,键名中的 / 写成 ~1、~ 写成 ~0,与 URL 百分号编码不同。

数组索引基于前面操作执行后的文档,增删元素可能改变后续索引对应的对象。

Property: a/b~c
Pointer:  /a~1b~0c

用 test 明确前置条件

test 可在修改前检查值,失败应停止整个补丁;本站不会把部分应用后的结果当作成功返回。

本地 test 不能替代服务端并发控制,应按协议结合版本或 ETag,再对比最终文档。

参考资料

← JSON 与数据处理指南