Skip to content

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 PatchContent-Type: application/merge-patch+json
  • 精确控制(如数组插入)→ 用 JSON PatchContent-Type: application/json-patch+json
  • 操作 Kubernetes 资源 → 用 Strategic Merge Patch

Released under the MIT License.