AZ Tools

JSON Patch 构建器 (RFC 6902)

开发

RFC 6902 JSON Patch 是描述 JSON 文档更改的 wire 格式 — 用于 PATCH 请求、乐观更新、撤销历史和操作变换。这个工具做两个方向:粘贴 source 和 target JSON,得到将一个转换为另一个的最小 patch;或粘贴 source 和 patch,看应用后的结果。diff 使用递归结构比较,对包含斜杠或波浪号的键使用 `~0`/`~1` JSON Pointer 转义。apply 端遵循全部六个操作,包括 `test`(断言失败抛出错误)、`copy` 和 `move`。用于在打到服务器之前测试 patch,或通过示例找出正确的操作。

Patch (RFC 6902)
[
  {
    "op": "replace",
    "path": "/age",
    "value": 31
  },
  {
    "op": "replace",
    "path": "/address/city",
    "value": "Busan"
  },
  {
    "op": "remove",
    "path": "/address/zip"
  },
  {
    "op": "add",
    "path": "/address/country",
    "value": "KR"
  },
  {
    "op": "replace",
    "path": "/tags/1",
    "value": "owner"
  },
  {
    "op": "add",
    "path": "/tags/2",
    "value": "user"
  }
]

纯 RFC 6902 — 支持 add、remove、replace、move、copy、test 操作,带 `~0`/`~1` pointer 转义。

使用方法

  1. Diff 模式:粘贴 source 和 target,看 patch JSON。编辑任一侧查看 patch 如何变化。
  2. Apply 模式:粘贴 source 和 patch 数组,看结果文档。错误(坏 pointer、失败的 `test`)内联显示。
  3. JSON Pointer 语法:`/foo/0/bar` 走 `foo.0.bar`。把 `/` 转义为 `~1`,`~` 为 `~0`。数组路径中的尾随 `-` 表示『追加』。

常见问题

为什么不直接发送新文档?
一是带宽。二是并发:如果 Alice 和 Bob 都编辑文档,你可以语义化合并他们的 patch(`replace /name` 与 `add /tags/-` 兼容),而两个完整文档必须选一个赢家。此外,patch 是什么·何时变更的精确审计轨迹。
和 JSON Merge Patch (RFC 7396) 一样吗?
不一样。Merge Patch 更简单 — 你发送部分文档,其中存在的键覆盖,`null` 删除。对人类更容易但失去精度(不能添加到数组、不能表示字面 `null` 值、无原子 test)。RFC 6902(本工具)是精确 wire 格式。RFC 7396 是便利格式。

相关工具