JSON 格式化最佳实践:易读、有效且高效
快速解答
使用 2 个空格缩进以实现人类可读的 JSON,无尾随逗号、双引号键和一致的键顺序(按字母顺序或域含义)。缩小 JSON 用于生产传输,并漂亮打印用于开发。使用我们免费的 JSON 格式化程序可立即在两者之间切换。
介绍
JSON 格式选择会影响可读性、文件大小和调试速度。虽然 JSON 语法是由 RFC 8259 严格定义的,但如何缩进、排序键和处理空格是一个约定问题。本指南解释了广泛采用的最佳实践,以便您的 JSON 在团队之间保持一致、易于调试且在线高效。
步步
-
选择缩进宽度
2 个空格是最常见的约定(Prettier、ESLint、Google JSON 样式指南)。对于深度嵌套的配置来说,4 个空格是可以接受的。不鼓励使用选项卡,因为不同编辑器的渲染效果不同。选择一个并在整个项目范围内强制执行。
-
一致地订购密钥
要么按字母顺序对键进行排序以获得确定性输出(对于缓存和差异很有用),要么按域含义进行分组(首先是 id,然后是属性,然后是关系)。避免随机密钥顺序 - 它会使差异变得嘈杂并破坏快照测试。
-
缩小生产运输
缩小 JSON 删除所有非必要的空白,将有效负载大小减少 10-0%。在生产中提供来自 APIs 的缩小版 JSON,并保留打印精美的 JSON 仅用于本地开发和调试。
-
发送前验证
在发送到 API 或写入配置文件之前,始终通过验证器运行 JSON。单个尾随逗号或不带引号的键将导致 JSON.parse() 抛出并破坏消费者。
-
使用格式化程序切换模式
将 JSON 粘贴到 JSON 格式化程序中,以美化阅读或缩小以便传输。该工具验证语法并报告任何错误的确切位置,从而节省调试时间。
示例
印刷精美(2 个空格缩进)
输入: {"id":1,"name":"Alice","active":true}
输出: {
"id": 1,
"name": "Alice",
"active": true
}
缩小生产规模
输入: {
"id": 1,
"name": "Alice"
}
输出: {"id":1,"name":"Alice"}
按字母顺序排序的键
输入: {"zebra":1,"apple":2,"mango":3}
输出: {"apple":2,"mango":3,"zebra":1}
常见问题
- 尾随逗号:{"a":1,} 无效 JSON。大多数格式化程序都会删除它们,但像 JSON.parse() 这样的严格解析器将拒绝输入。
- 单引号和不带引号的键:{'a':1} 和 {a:1} 是有效的 JavaScript,但 JSON 无效。始终对键和字符串值使用双引号。
- JSON 中的注释:标准 JSON 不允许 // 或 /* */ 注释。如果需要内联文档,请使用 JSONC、JSON5 或单独的架构文件。
- 混合缩进:混合制表符和空格会破坏 diff 工具,并可能导致“缩进不一致”lint 错误。在提交之前使用格式化程序进行规范化。
提示
- 将编辑器配置为在保存时使用 2 个空格缩进格式化 JSON — 这可以防止代码审查中的样式争论。
- 对于 API 响应,设置 Content-Type: application/json; charset=utf-8 并通过 gzip/Brotli 压缩提供缩小的 JSON 服务,以实现最大效率。
- 在快照测试中对 JSON 进行散列或比较时,使用确定性键排序(例如按字母顺序)——随机顺序会导致误报失败。
- 当调试大型 JSON 有效负载时,首先对其进行漂亮打印,然后使用正则表达式或 jq 提取相关子树,而不是通过肉眼扫描。