JSON 差异与 JSON Patch
数据互转
正在载入
正在加载工具
正在准备工具,暂时无法估算剩余时间。
本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。
关于这个工具
左侧输入原始 JSON,右侧输入目标。差异表与 JSON Patch 同时提供;导出前先在本地实际应用补丁,并检查结果是否与目标等价。
常见用途
- 检查配置修改并复制逐路径差异报告。
- 为已知原始 JSON 文档生成 add/remove/replace 补丁。
- 比较大整数标识符,避免二进制浮点舍入。
使用方法
- 1.在分别标注的原始与目标输入框中粘贴严格 JSON 值。
- 2.点击比较并生成补丁;可点击取消终止工作线程。
- 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 解析器仍可能舍入。