sublime text无法直接比对json文件,需先用pretty json插件格式化或用jq命令行标准化(-s排序、处理注释),再通过compare files进行行级差异比对;复杂场景建议拆分配置+git管理。

Sublime Text自带的Diff功能根本不能直接比JSON文件
Sublime Text本身没有内置JSON Diff工具,所谓“Diff工具”其实是通过第三方插件或系统级命令模拟实现的。直接用View → Differences菜单(如果存在)或拖入两个文件后右键选“Compare”——大概率会失败或只比文本行,不理解JSON结构。真正能用的方案只有两种:一是装插件做结构化比对,二是调外部工具(如jq或diff)预处理后再比。
用Pretty JSON插件先格式化再人工比对最稳妥
很多JSON配置文件是压缩成一行的,直接Diff全是噪音。必须先格式化,否则连哪一层嵌套变了都看不出来。
- 安装
Pretty JSON插件(Package Control搜即可),快捷键Ctrl+Alt+J(Win/Linux)或Cmd+Alt+J(macOS)格式化当前文件 - 两个文件都要格式化,且确保使用相同缩进(默认4空格,可在
Preferences → Package Settings → Pretty JSON → Settings里设"indent": 2统一) - 格式化后,用Sublime原生的
File → Diff → Compare Files(需先打开两个标签页)——它会弹出新窗口,高亮行级差异,但不会合并键、忽略顺序变化
注意:Pretty JSON默认不排序key,如果两个文件key顺序不同(比如一个按字母排、一个按写入顺序),Diff会显示大量“假差异”。这时得手动加-S参数用jq重排,见下一条。
用jq命令行预处理,解决key顺序和空白导致的误报
JSON语义上{"a":1,"b":2}和{"b":2,"a":1}完全等价,但纯文本Diff会标红整行。用jq标准化是最可靠的办法。
- 确保已安装
jq(macOS用brew install jq,Windows用choco install jq或下载二进制) - 终端执行:
jq -S . file1.json > file1.normalized.json和jq -S . file2.json > file2.normalized.json——-S自动按key字母序排序,.表示原样输出(但已格式化+排序) - 把两个
.normalized.json文件拖进Sublime,再用Compare Files,此时差异基本都是真实变更
如果文件含注释或非标准JSON(比如BOM、尾随逗号),jq会报错parse error,得先用sed或编辑器删掉注释,或者换用支持注释的工具如json5。
复杂嵌套或字段太多时,别硬靠肉眼Diff
超过500行、多层嵌套数组+对象混合的JSON,Sublime的行Diff很快失效——你找不到哪个"timeout"字段在第几层改了,也看不出数组元素是增删还是重排。
- 临时方案:用
jq抽关键路径对比,例如jq '.server.timeout' file1.json和jq '.server.timeout' file2.json单独比 - 长期建议:把配置拆成模块化小文件,用Git管理,每次
git diff天然带语义(尤其配合jqalias) - 别依赖Sublime插件自动合并——目前没插件能安全处理JSON数组重排或深层merge,一不小心就把生产配置覆盖错了
真正的难点不在怎么比,而在确认“哪些差异是预期的、哪些是事故”。格式化+排序只是第一步,后续还得结合上下文判断每个变更的影响范围。











