关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们查阅了 jq 官方手册中的键排序功能,梳理出了一套能让人们更容易阅读 JSON 配置差异的安全步骤。验证状态:📘 已确认 jq 官方规范・Ubuntu 实机未验证
直接对 JSON 文件执行 diff 时,有时仅因为键顺序不同就会产生大量的差异。使用 jq 规范化键顺序后再执行 diff这样就能集中精力查看配置值的差异了。
首先尝试
cat > before.json <<'JSON'
{"port":8080,"mode":"test","enabled":true}
JSON
cat > after.json <<'JSON'
{"enabled":true,"mode":"prod","port":8080}
JSON
jq -S . before.json > before.sorted.json
jq -S . after.json > after.sorted.json
diff -u before.sorted.json after.sorted.json
需要关注的差异是 mode 的 test → prod。键的重新排序将从差异中消失。
为什么 -S 会有效
在人工确认配置差异时,JSON 对象中键的顺序往往不是本质所在。jq -S 会对对象的键进行排序并输出,从而减少书写形式上的不一致。
尝试修改一处
port 将其从 8080 修改为 8081 并重新运行。差异将变为两处,在审查时可以一眼看出“修改了什么”。
如果在工作中应用
可用于 Web 服务器配置、API 响应、导出的应用配置、AI 生成的 JSON 变更确认等。在将变更申请附加提交之前,请同时确认其中是否包含机密数值。
jq 'del(.password, .token, .secret)' config.json
此示例仅删除顶级同名键。这并不意味着能够自动完全清除嵌套的或使用其他名称的机密数值。
注意
规范化并不保证“含义相同”。由于数组的顺序有时具有特定含义,请勿盲目使用 sort。
总结
在比较 JSON 时,如果先减少格式上的差异再查看 diff,人工审查就会变得轻松。jq -S + diff -u 是一个可以从小处着手进行尝试的实用组合。
官方信息与第一手资料
- jq 手册:https://jqlang.org/manual/
