JSON差异工具

把两段 JSON 粘进来,立刻告诉你哪些字段新增、删除或改了值,按路径列出改动前后。全部在浏览器本地完成。

使用方法

JSON差异工具 的用法就三步。第一步,把「原值」粘进左侧 JSON A 框、「新值」粘进右侧 JSON B 框,可以直接点「载入示例」填入一段示范。第二步,点「比较差异」(多行文本用 Ctrl 或 Command 加回车触发),工具会先分别解析两段 JSON,再做递归对比。第三步,看下方结果:先是一行数量摘要,再是一张「操作 / 路径 / A 值 / B 值」的明细表,改动一目了然。点「复制结果」可把整段差异带走。如果只想快速看格式对不对,先用开发者工具里的 JSON 校验再回来比也行。

这个JSON差异工具能解决什么问题

接口回归时,两份返回结构一多就难用眼睛比。这个工具把新增、删除、修改三类改动分开列,改了哪个字段、从什么值变成什么值都写清楚,适合排查「为什么前端突然少了个字段」。配置热更新前后,把新旧两份配置丢进来,立刻知道运维改了哪几个开关。做数据迁移或 ETL,先用它确认源和目标的关键节点是否一致,再决定补数。它也能帮你看清数组按索引对齐后的逐元素差异,定位列表里具体哪一项变了。本工具只做结构对比,不做格式化缩进、也不做压缩,那种需求请用 JSON 格式化或压缩类工具。

原理与规则说明

工具先用原生 JSON.parse 把两段文本解析成对象树,解析失败会定位出错位置并给出具体中文提示。接着做深度比较:不是比引用地址(否则两个内容相同的对象会被判不等),而是递归下钻到每一个叶子值。对对象,取两侧键名的对称差(并集里只在一侧出现的键就是新增或删除);对数组,按索引一一对齐,多出来的下标算新增、少掉的算删除。每发现一处不一致,就记录「操作类型 + 路径 + 前后值」,路径用点号连键、方括号连下标,例如 user.role、tags[2]。这套差异语义参考了 RFC 6902(JSON Patch)里的 add / remove / replace 三类操作,但输出的是人能直接读的中文列表,而不是补丁文档。值是否相等用 JSON.stringify 做深度序列化比较,所以 1 和 1.0 会被判相同,而字符串 "1" 与数字 1 因类型不同会被判修改。

完整示例(数值仅作演示)

A 为 {"name":"柳泉","tags":[1,2,3],"n":1},B 为 {"name":"柳泉工具","tags":[1,2,4],"n":1,"extra":true}。比较后:name 从「柳泉」改成「柳泉工具」(修改);tags[2] 从 3 改成 4(修改);extra 在 A 里没有、B 里是 true(新增)。所以摘要是修改 2、新增 1、删除 0。这套结果和上方预填的明细表、以及下方对照表第 1、2、3 行(修改对象值 / 修改数组元素 / 新增键)三处完全一致,方便你核对工具判得对不对。

输入范围与对照表

差异判定按「路径 + 操作」分类,下面这张表列出常见情形与处理方式(前 12 行直出,余下点「加载更多」)。注意数组按索引对齐而非按集合语义,所以调换顺序会被判成多处改动;数字 1 与 1.0 视为相等,字符串 "1" 与数字 1 视为不同。复制整张表用「复制对照表」,导出用 CSV(带 BOM)或 JSON(不带 BOM)。

差异情形判定示例(A → B)
修改对象值replaceuser.name:柳泉 → 柳泉工具
修改数组元素replacetags[2]:3 → 4
新增键add(root).extra:无 → true
删除键removeremoved:x → 无
类型改变replaceflag:true → "yes"
嵌套修改replaceuser.role:admin → user
数组新增addarr[3]:无 → x
数组删除removearr[1]:x → 无
空对象变有值replace{} → {a:1}
有值变空对象replace{a:1} → {}
数字精度相同1 与 1.0(序列化相等)
null 变值replacea:null → a:0
值变 nullreplacea:0 → a:null
长数组整体替换replacearr:[1,2] → [3,4,5]
键顺序不同相同{a:1,b:2} 与 {b:2,a:1}
字符串 vs 数字replace"1" 与 1(类型不同)

输入范围、边界与精度说明

两段都必须是不含注释、不含尾逗号的合法 JSON——标准 JSON 不允许 // 注释和尾逗号,写了会报「第几行第几列附近有多余逗号 / 非法字符」,并标出具体位置而不是笼统说失败。循环引用在标准 JSON 里本就不允许,JSON.parse 会直接报错。长度上限建议单次各不超过 2 MB,超长文本先分段比;极深嵌套(成百上千层)会占用较多内存,但常规接口数据毫无压力。数组按索引对齐意味着「把列表第一个挪到最后」会被判成整段改动,这是设计使然,不是 bug;若你希望按内容集合比较,请先把数组排好序再比。两侧都为空或完全相同会明确提示「两段 JSON 完全一致」,不会静默归零。

常见问题

两段都合法但提示解析失败?

多半是混入了 JavaScript 写法:尾逗号、单引号、注释或 undefined。按报错里标出的行号删掉尾逗号、把单引号改成双引号即可,标准 JSON 只认双引号键名。

数组顺序变了为什么判成多处修改?

工具按索引对齐比较(arr[0] 对 arr[0]),所以调换顺序会逐项判改。需要忽略顺序时,先把数组排序或按 id 归一后再比。

1 和 1.0 为什么算相同?

值比较用 JSON.stringify 深度序列化,1 和 1.0 序列化后都是 "1",因此判为相等;但字符串 "1" 与数字 1 因类型不同会判修改。

路径里的 tags[2] 是什么意思?

方括号表示数组下标,从 0 开始。tags[2] 就是 tags 数组里的第 3 个元素;对象键用点号,如 user.role。

能比超大的 JSON 吗?

能,但建议单次各不超过 2 MB。更大的文件先拆分或只贴变动的子系统,避免标签页短暂卡顿。

粘贴的内容会上传吗?

不会。解析和比较全在浏览器本地完成,刷新即清空,含敏感字段的接口数据也不会离开设备。

和 JSON 格式化是同一件事吗?

不是。格式化只管缩进排版,差异工具专门找两段之间的新增、删除、修改,两者配合用更高效。

结果能导出吗?

能。明细表和对照表都支持 CSV(带 BOM,Excel 不乱码)和 JSON(不带 BOM)导出,也可用「复制对照表」直接复制。

相关工具

这些工具都和 JSON差异工具 一样在本地运行,常配合接口与文本处理: