JSON 差异对比工具
把两段 JSON 粘贴进左右编辑器,DevKitLab 会同时给出 git 风格的并排或行内差异,以及按 JSON Path 组织的结构化变更列表。某条字符串值变化太长时,会在右侧面板中以词级红绿高亮告诉你具体差在哪一段,不需要再去人工 diff 一段长字符串。可以忽略键顺序进行语义对比,可以折叠未变更区域只看差异,可以一键在上一处/下一处变更之间跳转,可以一键格式化两侧统一缩进。所有处理都在浏览器本地完成,左右 payload 不会发送到服务器。
- 左右双栏 git 风格对比,红绿高亮整行变更,行内进一步标出字符级差异
- 可切换 unified 行内模式,小改动直接内联显示新旧片段,无需上下两栏比较
- 右侧结构化面板按 JSON Path 列出新增 / 删除 / 修改 / 移动,点击即可跳到编辑器对应位置
- 长字符串改动会在面板里展开词级红绿 diff,定位到具体差异片段
- 可忽略键顺序进行语义对比,避免因键名重新排列而显示"全表变化"
- 折叠未变更区域(默认开启)只显示差异附近的上下文,长 JSON 也能一眼看完
- 上一处 / 下一处差异快捷跳转,左右内容可一键交换,可一键格式化两侧
- 数组按 id / key / name / uuid 等启发式 hash 对齐,避免插入一项导致整段错位
- 左右输入自动保存到 localStorage,刷新页面后内容仍在
- 完全本地处理:两侧 JSON、token、配置和日志内容不会发送到服务器
功能简介
这个 JSON Diff 不是简单地把两段 JSON 上下放在一起看。它同时给出"按文本对比"和"按结构对比"两种视角,配合字符级高亮、词级长字符串差异、路径跳转和数组对齐,让你在 review 接口变更、配置改动、fixture 差异时少走弯路。
- 01
并排 git 风格差异
左右两个 CodeMirror 编辑器同步滚动,变更行整行高亮,行内进一步用字符级高亮标出具体改动位置,类似 GitHub PR 的双栏 diff。
- 02
行内 unified 模式
切换到 unified 后变成单编辑器,旧文本作为只读对照显示在改动块上方;小范围改动会内联展示新旧片段,便于在窄屏或文档里看清逐字差异。
- 03
结构化变更列表
右侧面板列出每一处变化,按 $.users[2].name 这样的 JSON Path 索引。新增 / 删除 / 修改 / 移动分别用不同颜色和图标标记,一眼分清类型。
- 04
长字符串词级 diff
当某个字符串字段两侧都很长且不同时,面板会在该行下方展开词级红绿高亮,告诉你具体哪一段被改写、被插入或被删除,不需要再开第二个工具对比长文本。
- 05
忽略键顺序进行语义对比
开启"忽略键顺序"后,结构化对比会先递归排序键名再 diff。配合"格式化两侧"还能把两侧编辑器内容也排序后重写,让视觉 diff 同样无视键顺序。
- 06
折叠未变更区域
默认开启的"折叠未变更"会自动折叠 diff 之外的大段相同内容,每个改动块上下各保留 3 行上下文。在数千行的配置或大 payload 里也能直奔差异。
- 07
差异之间跳转与导航
上一处 / 下一处按钮按 chunk 级别跳转,配合面板点击 JSON Path,可以在长 diff 里快速 review 每一处改动而不漏看。
- 08
数组按内容对齐
默认根据每个元素的 id / key / name / uuid / _id 字段做 hash 匹配,避免"在数组中间插入一项就导致整段被标为变更"的常见 diff 噪音。
- 09
一键格式化两侧
当两侧缩进、键序不一致时,可以一键把两侧都重写为 2 空格缩进的格式化版本(开启"忽略键顺序"时同时排序),让视觉 diff 立即变干净。
- 10
完全本地,零上传处理
解析、对比、字符串 diff、复制和文件读取都在浏览器本地完成。左右两侧的 JSON、生产响应、token 和配置不会发送到服务器。
如何使用
常见流程是:粘贴两侧 JSON,按需开启忽略键顺序或格式化两侧,结合并排视图和右侧结构化列表逐处 review,最后复制有问题的字段路径。
- 01
把"原始 JSON"和"修改后 JSON"分别粘贴到左右编辑器。两侧都可以直接编辑,输入会自动保存到 localStorage。
- 02
默认进入并排对比模式:变更行整行红 / 绿高亮,行内会进一步标出字符级差异;不喜欢上下视野的可以切换到"行内对比"模式。
- 03
看右侧"结构化差异"面板,按 JSON Path 索引每一处新增 / 删除 / 修改。点任意一行可跳到编辑器对应位置。
- 04
如果某个字符串字段两侧都很长,面板会自动展开词级 diff,告诉你具体哪一段不一样。
- 05
两侧键顺序不同导致全表变化时,开启"忽略键顺序"并点击"格式化两侧",让左右都按排序后的格式重写,diff 立即干净。
- 06
用"上一处 / 下一处"按钮在长 diff 里依次 review;默认会折叠未变更区域,必要时关闭以恢复全文上下文。
- 07
需要在文档或工单中引用某个字段时,把鼠标移到面板某行,点击"复制路径"获得 $.data.users[0].email 这样的精确路径。
功能说明
这些功能覆盖了 JSON diff 时最常见的几类问题:行级差异看不到字符细节、长字符串无法定位差异位置、键顺序不同导致全表变化、数组中间插入一项就错位、长 payload 看不完。
- 并排 git 风格双栏视图,整行红绿高亮,行内字符级 outline 标出具体差异。
- unified 行内模式,把旧文本作为只读对照覆盖在改动块上方;小改动直接内联展示新旧片段。
- 右侧结构化变更面板按 JSON Path 列出每一处变化,新增 / 删除 / 修改 / 移动分别配色。
- 长字符串改动自动展开词级红绿 diff,定位到具体哪一段被改写。
- "忽略键顺序"开关让结构化对比无视键名顺序,避免无意义的"全表变化"。
- "折叠未变更"自动折叠 diff 之外的大段相同内容,长 JSON 也能直奔差异。
- "上一处 / 下一处"按 chunk 级别跳转,长 diff 不漏看。
- 数组按 id / key / name / uuid / _id 启发式对齐,避免插入一项导致整段错位。
- 一键"格式化两侧",把左右编辑器都重写为统一缩进,配合忽略键顺序时同步排序。
- "交换"一键互换左右,"清空"一键重置;左右输入自动持久化到 localStorage。
- 主题自动跟随系统深浅色,红 / 绿配色在两种主题下都保持对比度。
适合哪些场景
这个页面适合所有"我手里有两段 JSON,想知道它们到底差在哪里"的场景。
-
API 响应变更 review
把上一版接口返回和当前返回粘到两侧,快速看清哪些字段新增、哪些字段被删、哪些值变了,特别是嵌套字段和长字符串字段。
-
配置文件 diff
tsconfig、package.json、eslint 配置、CDN 规则、feature flags 改动 review。开启忽略键顺序后,键序变化不会污染真正的语义改动。
-
fixture / 种子数据回归
把测试 fixture 的旧版本和新版本对比,确认你的改动只影响了预期字段,没有意外修改其他用例。
-
JWT / token 解码后对比
把两次签发的 JWT 解码 payload 粘进来,对比 claims 的变化,确认 issuer、audience、scope 等字段是否符合预期。
-
AI 工具调用参数对比
对比同一次会话两次 tool call 的参数、Agent 中间状态的前后差异,定位是哪一步引入了不期望的字段变化。
-
Webhook payload 回放校验
把生产环境捕获的 Webhook 和回放环境产生的 payload 对比,确认 signature 之外的字段是否完全一致。
-
配置环境间差异
对比 dev / staging / prod 三个环境的配置 JSON,定位是哪几个 key 在不同环境下有差异,方便统一基线。
-
迁移前后数据比对
在数据迁移、批量改名或重构后,把迁移前后的样本 JSON 粘进来,确认结构变化符合预期、值字段没被意外覆盖。
-
事故复盘
把出问题时的 payload 和正常 payload 粘进来对比,配合长字符串词级 diff,快速定位是哪一段编码或字段值导致了下游异常。
理解这里的"差异"
JSON Diff 看起来直接,但"按文本对比"和"按结构对比"会给出不同的结果。下面这些概念在 review 时常被忽略。
-
文本对比 vs 语义对比
左右编辑器中的红绿高亮按文本 diff,会把空白、键顺序、缩进差异都视为变化。右侧结构化面板按语义 diff,只关心字段和值的实际改动。两者结合使用更准。
-
键顺序在严格 JSON 里不重要
{"a":1,"b":2} 和 {"b":2,"a":1} 在 JSON 数据语义上相同,但文本不同。开启"忽略键顺序"后,结构化对比把它们视为一致;如果还想让视觉 diff 也一致,请用"格式化两侧"。
-
数组的"对齐"决定 diff 噪音
数组中间插入一项时,如果按位置 diff 会把后面所有元素都标为变化。这里默认按每个对象元素的 id / key / name / uuid 启发式对齐,避免这种伪差异。
-
长字符串值需要词级 diff
当一个字段是长字符串(比如 description、prompt、URL、HTML 片段),整体标记为"改变"基本没用。这里会自动展开词级红绿高亮,定位到具体差异片段。
-
移动 vs 修改的区别
数组中元素从一个位置挪到另一个位置,jsondiffpatch 会识别为"移动"而不是"删除 + 新增"。这条信息可以帮你判断这是顺序调整还是真正的内容变化。
-
JSON Path 是引用单一字段的标准方式
面板里每一行的 $.users[2].name 形式可以直接复制,用在文档、工单或代码注释里,比"那个用户名字段"清晰得多。
使用建议
配置 diff、接口变更 review 和 fixture 比对,越大的 payload 越需要一套固定的检查习惯。下面这些做法能减少误判。
- 粘贴后先看右侧顶部的"共 X 处新增 · Y 处删除 · Z 处修改"摘要,先估摸改动规模,再决定是逐处 review 还是抽样。
- 看到大面积差异时,先确认是不是键顺序或缩进引起的伪差异。开启"忽略键顺序"并"格式化两侧",再判断实际语义改动。
- 数组中间插入或删除一项时,依赖默认的 id / key / name / uuid 对齐;如果你的数组元素没有这些字段,可以临时给样本加一个稳定字段再对比。
- 看到字符串字段的"长改动"先展开词级 diff,再决定要不要进入文本 diff 工具进一步分析。
- 长 JSON review 时保持"折叠未变更"开启,用上一处 / 下一处按 chunk 跳转,避免漏看小改动。
- 需要把某处改动写进工单或文档时,复制结构化面板里的 JSON Path,比口头描述精确得多。
- 处理生产 payload 前先脱敏。工具不上传数据,但你截图、贴到工单或聊天里的内容可能会泄露。
边界与注意事项
这个工具专注 JSON 内容的差异展示,不替代 schema 校验、变更评审流程或专业的版本控制。
- 它给出"哪里不一样",但不会告诉你"应该不应该不一样"。业务规则、版本约束、向后兼容判断仍然需要 schema、code review 和回归测试。
- 它不是 Git。这里没有提交历史、分支或 blame,仅做两个静态 payload 的对比。要追踪长期演变,请使用版本控制系统。
- 长字符串词级 diff 用 word 切分,对中日文等无空格语言效果有限;遇到时建议结合编辑器里的字符级 outline 一起看。
- 数组对齐基于 id / key / name / uuid 启发式。如果你的数组元素既无稳定标识又顺序敏感,diff 结果会和按位置对比一致,可能仍然出现错位。
- 几十 MB 的超大 payload 可能会拖慢浏览器。建议先截取相关子树,或使用命令行 diff 工具。
- 所有处理在本地完成,但本地安全仍取决于你的设备、浏览器扩展、共享屏幕和复制目标。
常见问题
这里整理了关于结构化差异、长字符串 diff、键顺序、数组对齐、隐私和大型 payload 的常见问题。
我的 JSON 会上传到服务器吗?
不会。解析、对比、字符串 diff、复制和文件读取都在当前浏览器标签页内完成。DevKitLab 不会把你的 payload 发送到服务器。
左右两侧编辑器红绿高亮和右侧结构化列表为什么有时不一致?
编辑器里的红绿高亮按文本 diff,会受空白、键顺序、缩进影响;右侧结构化列表按语义 diff,只关心字段和值的实际改动。开启"忽略键顺序"并"格式化两侧"后两者通常一致。
"忽略键顺序"具体在做什么?
它在计算结构化差异时先递归把对象键排序,再 diff。所以 {"a":1,"b":2} 和 {"b":2,"a":1} 不会被视为不同。注意它只影响结构化面板,不改写编辑器;想让视觉 diff 也忽略键顺序,请点击"格式化两侧"。
数组中间插入一项为什么没把后面所有项都标成变化?
工具默认根据每个对象元素的 id / key / name / uuid / _id 字段做匹配,识别"哪个元素从哪里移到了哪里"。如果你的元素没有这些字段,会退化为按位置对比,这时插入一项确实会让后面整段被标为变化。
某个字段是长字符串,diff 只标了"被改变",看不到具体差在哪?
右侧结构化面板会在长字符串改动下方自动展开词级红绿 diff,把删除的词标红、新增的词标绿。如果字符串特别长(> 20k 字符),为了避免卡顿会退化为整体红绿。
"折叠未变更"会不会把差异藏起来?
不会。它只折叠 diff 之外的大段相同内容,每个改动块上下各保留 3 行上下文。点击折叠条可以临时展开那一段;关闭这个选项可以恢复全文显示。
左右两侧的格式不一样(一个有缩进一个没有),diff 是不是会满屏红绿?
是的,因为编辑器按文本 diff。先点"格式化两侧"统一缩进,再看 diff 会清爽很多。结构化面板不受这个影响,因为它按语义对比。
"上一处 / 下一处"按钮按什么粒度跳转?
按 diff chunk(连续的变更块)跳转,而不是按结构化面板里的行。一个 chunk 可能对应面板里多条变化,反之一条字段改动可能跨越多个 chunk。
为什么我看到"移动"类型?
当数组中某个对象从一个位置挪到另一个位置(但内容不变)时,工具会识别为"移动"而不是"删除 + 新增"。这能帮你区分顺序调整和真正的内容变化。
左右编辑器关闭页面后内容还在吗?
在。左右输入会自动保存到 localStorage,下次打开页面时自动恢复。点击"清空"会同时清掉本地缓存。
它能处理很大的 JSON 文件吗?
几 MB 的 payload 通常没问题。几十 MB 的内容可能会拖慢浏览器,尤其是结构化 diff 部分。建议先截取相关子树,或使用命令行 diff 工具处理。
支持三路 diff(base / left / right)吗?
目前只支持两路对比。如果需要三路合并,建议交给 Git 自身的 merge 工具或 IDE 内置 diff 工具。
更多相关工具
可以继续在数据工具集合里完成 JSON 工作流:格式化、转换其他格式,或清理 payload 外层的文本包装。