返回

JSON 差异与 JSON Patch

数据互转

正在载入

正在加载工具

正在准备工具,暂时无法估算剩余时间。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

左侧输入原始 JSON,右侧输入目标。差异表与 JSON Patch 同时提供;导出前先在本地实际应用补丁,并检查结果是否与目标等价。

常见用途

  • 检查配置修改并复制逐路径差异报告。
  • 为已知原始 JSON 文档生成 add/remove/replace 补丁。
  • 比较大整数标识符,避免二进制浮点舍入。

使用方法

  1. 1.在分别标注的原始与目标输入框中粘贴严格 JSON 值。
  2. 2.点击比较并生成补丁;可点击取消终止工作线程。
  3. 3.检查差异表和完整的已验证补丁,长报告可以翻页。 结果有效时可复制报告、复制或下载补丁;修改任一输入会清除结果。

原文到目标的可验证示例

修改名称

原始值: {"name":"Ada"}
目标值: {"name":"Grace"}
[{"op":"replace","path":"/name","value":"Grace"}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

新增属性

原始值: {}
目标值: {"active":true}
[{"op":"add","path":"/active","value":true}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

删除属性

原始值: {"old":null}
目标值: {}
[{"op":"remove","path":"/old"}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

逆序删除数组尾部

原始值: [1,2,3]
目标值: [1]
[{"op":"remove","path":"/2"},{"op":"remove","path":"/1"}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

按顺序追加

原始值: [1]
目标值: [1,2,3]
[{"op":"add","path":"/1","value":2},{"op":"add","path":"/2","value":3}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

转义斜线和波浪号

原始值: {"a/b":{"~key":1}}
目标值: {"a/b":{"~key":2}}
[{"op":"replace","path":"/a~1b/~0key","value":2}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

空键不等于根路径

原始值: {"":1}
目标值: {"":2}
[{"op":"replace","path":"/","value":2}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

替换根值

原始值: null
目标值: [true]
[{"op":"replace","path":"","value":[true]}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

保留大整数

原始值: 9007199254740992
目标值: 9007199254740993
[{"op":"replace","path":"","value":9007199254740993}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

精确数值相等忽略拼写

原始值: {"n":1.00,"z":-0}
目标值: {"z":0,"n":1e0}
[]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

特殊键只作为数据

原始值: {}
目标值: {"__proto__":{"safe":true}}
[{"op":"add","path":"/__proto__","value":{"safe":true}}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

保留 Unicode 字符

原始值: {"emoji":"猫"}
目标值: {"emoji":"😀"}
[{"op":"replace","path":"/emoji","value":"😀"}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

按索引而非身份比较

原始值: ["a","b"]
目标值: ["b"]
[{"op":"replace","path":"/0","value":"b"},{"op":"remove","path":"/1"}]

将完整补丁应用到左侧 JSON 后,结果应与右侧值等价;操作顺序不能随意改变。

输入与导出检查

  • 拒绝解码后的重复键、注释、尾逗号和开头 BOM,不进行静默修复。
  • 空 Pointer 表示根;/ 表示空对象键;~1 解码为 /,~0 解码为 ~。
  • 原文变更后不能直接应用旧补丁,补丁不含 test 前置条件。
  • 修改输入、切换语言、取消或离开页面均会使旧结果与导出反馈失效。

限制与说明

  • 每份输入最多 200,000 UTF-8 字节、64 层容器、20,000 个值;最多 2,000 个操作,补丁与报告数据合计不超过 500,000 字节,每次最多 5 秒。
  • 精确比较十进制数,补丁中的数值保留原始拼写。数字最多 256 个字符,指数绝对值不超过 10,000;拒绝重复键和不成对的 Unicode 代理项。
  • 数组按索引而非记录身份比较。只生成 add/remove/replace,不保证最小补丁,也不是通用补丁导入器。忽略对象顺序、空白及数值相等的不同拼写。
  • 仅应用到完全相同的原始值;补丁不包含前置 test 操作。下游解析器可能损失数值精度或拒绝特殊键,使用前请检查。
  • 每页显示 50 条差异,每个值最多预览 400 个 UTF-16 代码单元。复制报告包含完整值,补丁导出完整。显示路径使用 $ 记法,补丁使用 JSON Pointer。

常见问题

补丁会恢复完全相同的目标文本吗?

恢复的是等价 JSON 值。空白、对象成员顺序、转义拼写以及 1.00 与 1e0 之类的数值等价写法不算变化;数组顺序和字符串码点仍需一致。

能导入任意 JSON Patch 吗?

不能。工具只生成并在内部验证 add/remove/replace,不导入补丁,不生成 move/copy/test,也不保证操作数量最少。

特殊键如何处理?

__proto__、constructor 和 prototype 等键只是 Map 中的普通数据,不写入 JavaScript 原型。外部补丁库可能拒绝这些键,请检查接收端。

数值精度如何保留?

在长度与指数上限内按精确十进制值比较。导出补丁中变更后的数字保留目标字面量;下游 binary64 解析器仍可能舍入。

相关工具