使用方法
- 把旧版 JSON 粘贴到“左侧 JSON”,把新版 JSON 粘贴到“右侧 JSON”。
- 如果数组是集合,例如标签列表,请勾选“忽略数组项的顺序”。
- 阅读“差异”表。每一行给出该值的“路径(JSON Pointer)”;“补丁检查”显示补丁有效时,即可复制“JSON Patch(RFC 6902)”。
两份文档如何比较
两份文档按值比较。对象中成员名称的顺序不影响结果,因为 JSON 把对象定义为一组成员。除非勾选该选项,数组中项目的顺序则有影响,因为数组是有序的列表。
数字按数值比较,因此1与1.0相等。RFC 8259 第6节指出,从 -(2^53)+1到 (2^53)-1的整数在各种实现中的读取结果一致,更长的整数在读取时可能被四舍五入。
路径与补丁
路径是 JSON Pointer(RFC 6901):每一步是一个名称或一个索引,步与步之间用斜杠分隔。标签列表的第一项是 /tags/0,空路径表示整份文档。名称中的斜杠写作 ~1,波浪号写作 ~0。
JSON Patch(RFC 6902)只使用三种操作:add、remove 和 replace。删除数组项时从后往前进行,使每个索引在使用时仍然正确;新增的项以索引“-”追加,RFC 6902 把它定义为数组的末尾。
忽略数组的顺序
勾选该选项后,项按其值而非位置配对。没有配对的项分别报告为新增或删除。内容不同的数组会在补丁中整体替换,因为只描述移动的补丁需要知道这些项是如何移动的。补丁中的数组则按右侧文档的顺序给出。
示例:默认文档
左侧文档的 name 为 FireToolLand,version 为1,tags 为 json 和 csv,free 为 true。右侧文档的 version 为2,tags 为 csv、json 和 yaml,并有值为 null 的 license。按顺序阅读,差异共六处:version、tags 中两个被修改的项、新增的 yaml 标签、删除的 free,以及新增的 license。
勾选“忽略数组项的顺序”后,两个标签只是顺序不同,因此标签的差异只剩 yaml 一项,差异数量降为四。
| 结果 | 默认文档 | 忽略数组顺序 |
|---|---|---|
| 差异数量 | 6 | 4 |
| 摘要 | 新增2处,删除1处,修改3处。 | 新增2处,删除1处,修改1处。 |
常见问题
为什么数组项的顺序会影响结果?
在 JSON 中,数组是有序列表,所以 [1,2] 与 [2,1] 是不同的数据。若数组其实是集合,例如标签或权限列表,请勾选“忽略数组项的顺序”。
/tags/0 这样的路径是什么意思?
这是 JSON Pointer(RFC 6901):先是成员 tags,再是它的第一项,因为索引从0开始。空路径表示整份文档;名称中含有斜杠时,用 ~1代替。
1与1.0是同一个值吗?
是的。两者都是数字1,因此页面不报告差异。超过 2^53的整数可能被 JSON 解析器四舍五入,所以较长的编号应当按文本比较。
JSON Patch 有什么用?
它是一组步骤(RFC 6902),服务器或程序库把它应用到一份文档上,即可得到另一份,例如用来更新保存的设置文件。补丁检查会显示这些步骤确实得到了正确的文档。
忽略顺序时,为什么整个数组会被替换?
忽略顺序后,若数组有改动,就没有任何一步操作能在不知道项目如何移动的情况下把它变为正确的数组。因此补丁会整体写出正确的数组。
我的 JSON 会被发送到什么地方吗?
不会。两段文本都在您的浏览器中读取和比较,您粘贴的内容既不会发送到我们的服务器,也不会存储在那里。
资料来源
- RFC 8259:The JavaScript Object Notation (JSON) Data Interchange Format(英文)
- RFC 6901:JavaScript Object Notation (JSON) Pointer(英文)
- RFC 6902:JavaScript Object Notation (JSON) Patch(英文)
数据和文字最近核对于2026年11月10日星期二。