JSON 工具 · 6 分钟阅读
JSON diff:比较数据的实际结构
文本差异会告诉您哪些字符发生了变化。 JSON diff 告诉您哪些值发生了变化,这些是不同的问题 - 通常有不同的答案。由于对象顺序并不重要,因此基于行的比较呈现为完全重写的有效负载在结构上可能是相同的,而单个嵌套值的真正更改可以隐藏在一个很长的缩小行内。
已更新
为什么文本差异在 JSON 上失败
JSON 的三个属性打破了字符级比较。键顺序并不重要,因此以两种方式序列化的同一对象看起来逐行不同。空白并不重要,因此打印精美的文档和缩小后的文档看起来完全不同。而且数组是位置性的,因此一次插入会移动后面的每一行,并产生一连串的错误差异,从而掩盖一个真正的变化。
结构比较报告的内容是什么
JSON diff 解析两个文档,遍历生成的树,并按路径报告更改:添加的键、删除的键、更改类型或内容的值以及移动的数组条目。输出读起来像 `spec.replicas: 3 → 5`,而不是 20 行移位的上下文。当部署行为不同并且您想知道配置中实际更改的内容时,这是您需要的信息。
- spec.template.spec.containers[0].image
+ ghcr.io/acme/web:1.4.2 → ghcr.io/acme/web:1.5.0
- metadata.annotations["deployed-by"] (removed)
在实际工作中使用 JSON diff
- API 版本控制 — 比较同一请求的 v1 和 v2 响应,并直接从路径读取合约更改。
- 失败的测试快照 - 查看哪个字段发生了漂移,而不是重新生成快照并希望。
- 基础设施审查 - 比较图表升级前后渲染的清单。
- 迁移检查 - 确认导出在架构或数据库更改后保留了每个密钥。
顺序对于数组而不是对象来说很重要:重新排序的数组是真正的更改,而重新排序的对象则不是。结构性 JSON diff 知道差异;文本差异永远不会。
值得了解的实用细节
在任何比较有意义之前,两个文档都必须有效JSON,因此验证错误应该首先浮现出来,包括行和列。注意类型漂移和价值漂移:`"3"` 和`3` 看起来几乎相同,但会打破消费者对其中一种的假设。当一侧为空或单个对象而另一侧为数组时,这通常是 API 形状更改的标志,而不是数据更改。双窗格 JSON 比较使两侧同时可见,这比将文件与记住的副本进行比较要快。
将有效负载保留在本地
差异正是您最不想上传的文档:生产响应、计费有效负载、与客户行的导出。在浏览器中比较它们意味着解析、树遍历和渲染差异都发生在您的计算机上,并且该工具可以在网络断开的情况下继续工作。
JSON 差异 — 常见问题
键顺序会影响 JSON diff 吗?
不会。对象键顺序在 JSON 中并不重要,因此结构差异将重新排序的键视为未更改。如果顺序更改对您有意义,那就是 JSON-with-order 语义(例如序列化映射),并且属于数组。
如何比较两个无效的 JSON 文件?
它们必须首先有效。通过 JSON 格式化程序或验证器运行两者,修复报告的行和列,然后进行比较。对格式错误的输入进行比较会产生差异,这些差异是语法错误造成的,而不是真正的数据更改。
JSON diff 能否显示添加或删除的值?
是的——这是相对于文本差异的主要优点。添加和删除的路径以及更改的值及其类型都会明确报告,因此删除的注释与更改的图像标签一样可见。
这篇文章中提到的工具
更多文章可供阅读
6 分钟阅读
JSON 格式化程序:漂亮、精简且有效
一个 JSON 格式化程序,可以漂亮地打印、缩小并验证准确的错误位置 - 加上几乎每个无效 JSON 错误背后的五个语法错误。
6 分钟阅读
JSON 到 JSON 模式:从样本有效负载到合约
在浏览器中将 JSON 转换为 JSON 模式:从真实有效负载推断草稿,然后强化所需的字段、格式和枚举 - 加上推断的限制。
- 较长的文章可供阅读: YAML 与 JSON:何时使用哪个(以及如何转换)