JSON 对比

JSON 对比,是指把两份 JSON 解析成结构树逐字段比较,用 data.items[0].price 式路径标出新增、删除、修改与类型变化,看清两版接口或配置改了什么。按结构比不按文本比:键顺序与缩进不同不误报,可忽略 updatedAt 等噪声字段,数组三种对齐,能导出统一 diff 与 JSON Patch,大数字按原文比不丢精度。全程在浏览器本地完成,JSON 不上传,免费无需注册。

数组对齐方式
常见噪声字段:

左右两侧都填入 JSON 后自动开始对比。

🔒 两侧 JSON 都在你的浏览器内解析比较,未上传任何服务器。它按结构比较,不检查 JSON Schema、也不理解业务含义;仅支持标准 JSON(不支持注释、尾随逗号、JSON5)。

如何使用JSON 对比

1

在左右两个输入框分别粘贴或选择要对比的 JSON 文件(左为原始/旧版,右为对照/新版)。内容不上传,浏览器本地处理;没有素材可以先点「填入示例」看效果。

2

按需设置:选择数组对齐方式(最小编辑 / 按下标 / 忽略顺序),在「忽略字段」里逐行填入 updatedAt、traceId 这类噪声字段(支持 data.*.updatedAt 通配一层),或勾选忽略大小写、忽略首尾空白、宽松类型。

3

两侧都填好后自动开始对比,先看结论行与统计条:完全一致、仅键顺序不同,还是有 N 处差异。哪一侧 JSON 有语法错误,就在该侧输入框下方直接标出第几行第几列。

4

在「差异列表」里按类型筛选或按路径搜索,点某条路径可跳到「并排结构树」对应位置;结构树里勾「仅显示差异」能把相同的分支全部折叠掉。

5

确认改动后导出:点「复制差异列表」拿纯文本清单,点「下载 .diff」拿统一 diff 文件(适合贴进 issue 或 PR),或点「导出 JSON Patch」拿 RFC 6902 操作数组(可直接喂给程序复现改动)。点「交换左右」可一键互换两侧,确认改动方向。

关于JSON 对比的常见问题

JSON 对比会上传我的数据吗
不会上传。解析、比较、生成差异列表和导出 diff / JSON Patch 全部在你自己的浏览器里完成,两侧 JSON 不会离开这台设备,关闭页面即清除(页面只加载站点访问统计脚本,它不读取、也不上报你粘贴的内容)。所以对比含密钥、token、用户手机号的接口返回也是安全的。本机存的只有比较偏好——数组对齐方式、几个忽略开关、视图选择这类非敏感参数;两侧的 JSON 内容和「忽略字段」列表(可能含你们的业务字段名)都不会写进 localStorage。你也可以断网使用:页面加载完之后整个对比过程不需要联网。
手机上能用 JSON 对比工具吗
可以,纯网页实现,手机浏览器直接打开就能用,不需要装 App、不用注册。窄屏下左右两个输入框会自动堆叠成上下两栏,避免挤在一起看不清。手机上建议主要看「差异列表」——它每条一行,显示路径加左右两个值,比并排结构树更适合窄屏;确实要看结构树时,记得勾上「仅显示差异」,把相同的分支折叠掉,剩下的内容一屏就能看完。手机上粘贴长 JSON 不方便的话,也可以点「选择文件」直接从手机里挑一个 .json 文件读进来。
JSON 对比能忽略键的顺序吗
默认就忽略,而且不提供开关——按结构比较时对象本来就是按键取值,键写在前面还是后面、缩进两格还是四格、有没有换行,都不算差异。这正是 JSON 对比和文本对比最根本的区别:同样两份内容,文本对比会把整段标红,JSON 对比会告诉你「两份 JSON 完全一致」。如果两份 JSON 的值完全相同、只有键的排列顺序不同,结论行会单独提示「值完全一致,仅键顺序不同」,方便你判断这次改动到底是不是序列化顺序变了。要注意数组不一样:数组是有序结构,元素顺序默认参与判等,想按集合比较请把数组对齐方式切到「忽略顺序」。
JSON 对比怎么忽略 updatedAt 等字段
在「忽略字段」文本框里逐行填写即可,命中的字段连同它的子树会被整枝跳过,不参与判等。三种写法:只写一个键名(如 updatedAt)表示忽略任意层级的同名键;写完整路径(如 data.user.token)表示只忽略从根算起的这一条;路径中可以用 * 通配一层(如 data.*.updatedAt),也支持 data.items[0].price 这样的下标写法。文本框下面有 updatedAt、createdAt、timestamp、traceId、requestId 五个常见噪声字段的一键填入按钮。如果忽略之后两份 JSON 就一致了,结论行会如实写成「两份 JSON 完全一致(已忽略 3 个字段)」,不会让你误以为是裸的一致。填的字段名不存在也没关系,静默无害。
JSON 数组对比是按下标还是按内容
三种都支持,默认是「最小编辑」。最小编辑用 Myers 差分找最少的插入删除,所以在数组头部插进一个元素时只报 1 处新增,不会把后面的元素全标成修改;相邻的一删一增会合并成同一个元素的修改,「某条记录改了一个字段」会被报成 [1].name 这样的字段级差异。「按下标」严格按位置比,适合长度固定、位置有含义的配置数组。「忽略顺序」按多重集合比,只报多了或少了哪些元素,适合标签、权限这类无序列表。下面正文里有三种方式在「头部插入 / 中间改字段 / 顺序打乱」三个场景下的实测对照表,可以照着选。元素特别多时(两侧元素数之积超过 400 万)会自动降级为按下标并给出提示,避免浏览器卡死。
JSON 对比怎么导出 diff 和 JSON Patch
两侧填好之后按钮行会多出三个导出按钮,产物用途各不相同。「复制差异列表」复制的是「[修改] price: 9.9 → 12.5」这样的纯文本清单,适合直接贴进群里或工单里说人话;「下载 .diff」得到一个 json-diff.diff 文件,它是把两侧各自「格式化 + 按键排序」之后做的行级统一 diff,贴进 issue、PR 描述或提交信息里能被 GitHub 高亮成绿红两色;「导出 JSON Patch」得到一份 RFC 6902 的操作数组,形如 {"op":"replace","path":"/price","value":12.5},可以直接喂给程序,把左侧那份改成右侧那份。要注意数组对齐方式切到「忽略顺序」时 JSON Patch 按钮会置灰——集合比较算不出元素该插到第几个下标,硬生成的 patch 应用后对不上,切回「最小编辑」或「按下标」即可导出。三种产物同样在本地生成、不经过服务器。
JSON 对比能处理多大的 JSON 文件
单侧上限约 100 万字符,超出会提示「JSON 过长,已拦截(单侧上限约 1,000,000 字)」而不是把浏览器卡死。走「选择文件」时先按字节预检,只接受 .json / .txt,体积上限 400 万字节(约 3.8 MB),读进来后再按字符数校一次。另外三道护栏:嵌套最多 64 层、差异列表最多显示 20000 条(统计仍是完整数字)、最小编辑对齐在两侧元素数之积超过 400 万时自动降级为按下标。日常的接口返回与配置文件都在这个范围内;真超了就按模块拆开分段比,或用「忽略字段」把大块噪声子树整枝去掉再比。
JSON 对比工具免费吗,需要注册吗
完全免费,不用注册、不用登录、不用装插件或客户端,也没有每天几次的对比次数限制,导出的统一 diff 与 JSON Patch 不加水印、不做内容删减。原因很实在:整个对比跑在你自己的浏览器里,我们这边没有服务器算力成本,也就没有卖会员的理由。页面加载完成之后甚至可以断网使用,断网状态下粘贴、对比、复制、下载都照常工作。要长期用的话建议直接把本页加到浏览器书签或手机主屏,比每次搜「json对比」再点进来快。
JSON 对比里的大数字会丢精度吗
不会。多数在线 JSON diff 直接用 JSON.parse 把数字转成 JavaScript 的双精度浮点数再比,12345678901234567890 和 12345678901234567891 会双双变成 12345678901234567000,于是被判成「一致」——这是真实会漏改动的坑。本工具的数字判等不经过双精度:把字面量原文规范成精确的十进制形式再逐位比较,所以 1、1.0、1e0 判等,0 和 -0 判等,1.50 和 1.5 判等,而两个超过安全整数范围的大数字、或 0.1 与 0.1000000000000000000001 这样的高精度小数会被如实报为不同。检测到超出安全范围的数字时,页面还会提示「已按字面量原文比较,不做数值近似」。
JSON 对比和文本对比有什么区别
文本对比看字面,JSON 对比看结构。文本对比逐行逐词比字符,缩进变了、键换了顺序、字符串用 \u4e2d 还是直接写「中」,都会被标成差异;好处是任何文本都能比,坏处是格式噪声会把真正的改动淹掉。JSON 对比先把两侧解析成结构树再逐字段比,只报值和字段的差异,输出的是 data.items[0].price 这样的路径,能直接告诉你改了哪个字段;代价是两侧必须都是合法 JSON,而且格式类差异(缩进、键顺序、转义写法)它一概不报。实践中两者搭配用:先用 JSON 对比确认「改了哪些字段」,需要看具体的文本改动再用文本对比,或者直接下载本工具生成的统一 diff——它是对两侧「格式化 + 按键排序」后做的行级 diff,贴进 issue 或 PR 正合适。
JSON 对比支持带注释的 JSON 吗
不支持,只接受标准 JSON。注释(// 或 /* */)、尾随逗号、单引号包裹的键或字符串、NaN / Infinity / undefined 这些字面量,以及 JSONC、JSON5、NDJSON 都会被判为解析失败,并在对应输入框下方标出第几行第几列、什么原因。这里刻意不做静默容错:如果偷偷帮你把注释吃掉再比,「对比通过」会给你错误的安全感。遇到这种内容,先用站内的「JSON 格式化/校验」把语法修正,再回来对比。另外有两种情况不报错但会提示:同一个对象里出现重复键时,按 JSON 规则取最后一次的值参与对比,并提示「第 N 行的键 xxx 重复」;文件开头带 BOM 时会自动跳过,不会因此报错。

JSON 对比的实测算例:两版接口返回差 5 处

两份 JSON 想快速找不同,最直观的办法是先看一组真实报文比对出来的结果。下面这组是同一个商品接口前后两次返回的报文,把它们原样粘进左右两框,默认设置(数组按最小编辑对齐、不忽略任何字段)下的结论行是「两份 JSON 有 5 处差异」。注意右侧把 idname 的位置对调了,这一处不会被报出来——键顺序不参与判等。

左(旧版)

{
  "id": 1001,
  "name": "拿铁",
  "price": 9.9,
  "tags": ["new", "hot"],
  "stock": { "wh": 3 },
  "updatedAt": "2026-08-01T10:00:00Z"
}

右(新版)

{
  "name": "拿铁",
  "id": 1001,
  "price": 12.5,
  "tags": ["hot", "sale"],
  "stock": { "wh": 3, "hk": 5 },
  "updatedAt": "2026-08-23T09:12:00Z"
}
上面这组报文在默认设置下的完整差异列表(复制差异列表按钮的原样输出)
类型路径左(旧版)右(新版)
修改price9.912.5
删除tags[0]"new"
新增tags[1]"sale"
新增stock.hk5
修改updatedAt"2026-08-01T10:00:00Z""2026-08-23T09:12:00Z"

三个细节值得记住。其一,tags 被报成「一删一增」而不是「两处修改」:最小编辑发现 "hot" 两侧都有、只是位置挪了,于是只报真正消失的 "new" 和新出现的 "sale";把数组对齐切成「按下标」,同一组数据会变成 tags[0]tags[1] 两处修改(总数仍是 5 处,但归类完全不同)。其二,stock 整个对象没有被标成「修改」,而是精确到新增的 stock.hk 一个键——对象是逐键递归比的,共同的 wh 不会被牵连。其三,把 updatedAt 填进「忽略字段」再看,结论行会变成「两份 JSON 有 4 处差异,已忽略 1 个字段」,括号里的说明是硬写死的,不会让你误以为是裸的一致。

JSON 数组对比的三种对齐方式怎么选:实测对照表

对象按键比较没有歧义,数组才是 JSON 对比里唯一需要你做选择的地方——同样两份数据,选错对齐方式,差异条数能差好几倍。下面三行是用本工具实测出来的结果,照着场景挑即可。

三种数组对齐方式在三个典型场景下的实测差异条数
场景(左 → 右)最小编辑(默认)按下标忽略顺序
头部插入一个元素:[1,2,3] → [0,1,2,3]1 处新增([0])3 处修改 + 1 处新增1 处新增
中间改一个字段:[{id:1,v:1},{id:2,v:2}] → v 改成 91 处修改([1].v)1 处修改([1].v)1 删 + 1 增
顺序打乱:[1,2,3] → [3,1,2]1 新增 + 1 删除3 处修改完全一致

结论很直白:接口返回、日志这类「可能插入或删除元素」的数组用默认的最小编辑;长度固定、位置有含义的配置数组(如三档阈值)用按下标,位置错了就该报出来;标签、权限码、白名单这类本来就无序的列表用忽略顺序,省得因为服务端换了个排序就满屏差异。

JSON 对比的数字判等规则:哪些算一致哪些不算

数字是 JSON 对比最容易出错的一类值。直接用 JSON.parse 把数字转成双精度浮点再比,写法不同的同一个数会被判成不同(少数情况),更糟的是两个不同的大数会被抹平成相同(会漏改动)。本工具的判等不经过双精度,而是把字面量规范成精确的十进制形式再逐位比较,规则如下。

JSON 对比的数字判定规则表(默认严格模式)
情形例子(左 vs 右)本工具判定
写法不同、数值相同1 vs 1.0 vs 1e0一致
指数写法与展开写法1e3 vs 1000一致
正零与负零0 vs -0一致
小数末尾补零1.50 vs 1.5一致
超出安全整数范围12345678901234567890 vs …891不同(按字面量原文比)
高精度小数0.1 vs 0.1000000000000000000001不同(按字面量原文比)
数字与字符串数字1 vs "1"类型变化;开「宽松类型」后判为一致

JSON 对比为什么把类型变化和修改分开统计

因为这两种差异的排查动作完全不同。值从 9.9 改成 12.5 是业务改动,看一眼就知道对不对;而字段从数字 1 变成字符串 "1"、从对象变成 null,通常意味着序列化方式或后端框架变了,会连带影响所有调用方。所以统计条把它们分成两栏,差异列表里也用不同颜色的徽标区分。同理,「键不存在」和「值为 null」也是两种结果:前者报新增/删除,后者报类型变化,不会混为一谈。如果你正在对比两种语言序列化出来的同一份数据(比如 PHP 把数字输出成字符串),打开「宽松类型」即可让 "1" 与 1、"true" 与 true 视为相同。

JSON 对比有哪些限制:不做什么与四道上限

写清楚边界比多说几个卖点更有用。本工具不校验 JSON Schema——它只报两份之间的差异,不判断字段类型是否符合约定;不理解业务语义——它不知道哪个字段是记录的主键,最小编辑模式下的元素配对基于整个元素规范化后的内容,所以当数组元素很大、又同时改了好几个字段时,仍可能被报成「删一条 + 增一条」而不是字段级修改(这时可以先用「忽略字段」把噪声字段去掉,让元素更容易配上对);不做格式差异对比——缩进、键顺序、转义写法的差异一概不报,要看这些请用文本对比。

规模上有四道明确的上限,超了会给中文提示而不是卡死:单侧最多约 100 万字符、嵌套最多 64 层、差异列表最多 20000 条(统计仍是完整数字)、最小编辑对齐在两侧元素数之积超过 400 万时自动降级为按下标。这些护栏都是为了让页面在浏览器里跑得住——毕竟所有计算都发生在你的设备上,没有服务器兜底,也正因为如此,你的 JSON 才不用上传。