JSON补丁标准
除了 JSON Patch (RFC 6902) 和 JSON Merge Patch (RFC 7386 / RFC 7396),目前在 IETF(互联网工程任务组)和主流开源生态中,没有其他被广泛采纳的、专门用于描述 JSON 文档差异或更新操作的 IETF 标准。
但我们可以从更广义的角度梳理出几类“相关”或“类标准”的补丁/合并机制,它们虽不是 IETF RFC,但在特定领域(尤其是 Kubernetes、云原生、数据库等)被广泛使用:
✅ 1. Strategic Merge Patch(战略合并补丁)
- 提出者:Kubernetes 团队
- 状态:非 IETF 标准,是 Kubernetes 特有的语义化合并策略
- 特点:
- 基于字段的元数据(如
patchStrategy:"merge"和patchMergeKey:"name")智能合并列表(list) - 能正确处理“添加容器”、“保留某些字段”等复杂场景
- 比 JSON Merge Patch 更强大(后者对 list 只能整体替换)
- 基于字段的元数据(如
- 使用场景:bash
kubectl patch deployment my-app --type strategic --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.25"}]}}}}' - 文档:Kubernetes Strategic Merge Patch
🔸 注意:RFC 7386 是 JSON Merge Patch,而 RFC 7396 不存在 —— 这是一个常见误传。正确引用是 RFC 7386。
✅ 2. JSON Delta / JSON Diff(非标准但流行)
这些是社区实现的“人类可读 diff 格式”,不是 IETF 标准,但工具链成熟:
jd工具格式(类似 unified diff)
示例:diff- "color": "gold" + "color": "red"- 工具:jd(支持转为 JSON Patch)
- RFC 6902 的“可视化扩展”:很多库(如
jsondiffpatch)在生成 patch 时加入上下文,便于调试,但底层仍兼容 RFC 6902。
✅ 3. Operational Transformation (OT) / CRDTs
- 用途:协同编辑(如 Google Docs)、实时同步
- 与 Patch 关系:OT 也用“操作序列”描述变更(如 insert/delete),但面向字符流或富文本,不专用于 JSON
- 代表协议:ShareJS、Yjs(CRDT)、Automerge
- 不是 JSON 补丁标准,但解决类似问题(增量更新)
✅ 4. GraphQL 的变更机制(非补丁标准)
- GraphQL 本身不定义 patch 格式,但可通过:
- Mutation 传递部分字段(类似 merge patch 语义)
- @defer / @stream 实现渐进加载
- 社区有提案如 GraphQL Live Queries,但无统一 patch 标准
✅ 5. 数据库/ORM 层的变更跟踪
- 如 MongoDB 的
$set,$push操作符 - SQL 的
UPDATE ... SET column = value - 这些是存储层指令,不是通用 JSON 补丁标准
📌 总结:主流“JSON 更新”机制对比
| 名称 | 标准状态 | 列表(array)处理 | 适用场景 | 是否幂等 |
|---|---|---|---|---|
| JSON Patch (RFC 6902) | ✅ IETF 标准 | 精确路径操作(/arr/1) | 通用、精确控制 | 是(若操作本身幂等) |
| JSON Merge Patch (RFC 7386) | ✅ IETF 标准 | 整体替换(无法局部修改 list) | 简单对象合并 | 是 |
| Strategic Merge Patch | ❌ Kubernetes 专有 | 智能合并(基于 key 合并 list) | Kubernetes 资源更新 | 是 |
| 自定义文本替换(如你之前的例子) | ❌ 私有协议 | 不适用(字符串级) | 富文本/SVG 替换 | 否(依赖内容匹配) |
💡 结论
- IETF 官方只有两个 JSON 补丁标准:RFC 6902(JSON Patch)和 RFC 7386(JSON Merge Patch)。
- Strategic Merge Patch 是事实上的“第三种标准”,但仅限 Kubernetes 生态。
- 其他如 OT、CRDT、数据库操作符等,属于不同抽象层次的变更机制,不直接替代 JSON Patch。
如果你在设计 API,建议:
- 简单更新 → 用 JSON Merge Patch(
Content-Type: application/merge-patch+json)- 精确控制(如数组插入)→ 用 JSON Patch(
Content-Type: application/json-patch+json)- 操作 Kubernetes 资源 → 用 Strategic Merge Patch
