JSON 配置文件是个好东西,绝大多数现代开发者每天都在和它打交道。但有一个问题,从入行第一天起就让人心里长刺:JSON 不支持注释,也不允许尾随逗号。你小心翼翼地在配置里加了一行说明,啪,解析器直接给你抛个红牌。你要在数组最后一项后面多加个逗号方便以后追加,啪,又是一声报错。这个问题在配置文件场景中尤其要命,因为配置的本质就是给人写的,需要解释、需要灵活。写代码还能加注释,配置文件反而要裸奔,这本身就有点反直觉。
这篇文章我打算从根上讲透这件事:为什么 JSON 会有这两个“反人类”设定,我们又是怎么在实践中绕过它的,以及今天有哪些成熟的解决方案——从 IDE 生态里的 JSONC,到更完整的超集 JSON5、HOCON,再到干脆换赛道的 YAML。我会给出不同技术栈下的接入方式、参数选型和踩坑记录,尽量让不管你是写前端、写 Python、写 Java 还是搞运维脚本的人,都能找到一套能直接抄作业的做法。
1. 为什么 JSON 在配置文件场景中天生吃亏
1.1 从 RFC 8259 说起:JSON 的设计初衷就不是给人手写的
JSON 的规范在 RFC 8259 里写得清清楚楚,它最初的设计目标是“语言无关的数据交换格式”。它的父亲 Douglas Crockford 在推广时强调的思路是:机器跟机器之间传递数据,要简单、稳定、无歧义。这种定位决定了它必须把语法压缩到极致,尽量减少“废话”。
注释是什么?注释是给人看的,对机器来说完全多余。尾随逗号是什么?是为了让人在长期维护时少删一行、多留一个位置,对机器来说只会增加解析负担和出错面。所以 JSON 干脆一刀切,这俩全不要。如果把 JSON 比作一段只有骨头的对话,那它就是那种只报“姓名、年龄、身份证号”的表格,能识别,但毫无温度。数据交换场景下这没问题,但一旦把 JSON 当配置文件用,问题就暴露了。
配置文件本质上是“代码和数据的交界地带”,它既要被程序解析,又要被人反复编辑。一个人员流动频繁的项目里,配置文件里的某个大数字、某个 URL 常量,如果没有注释说明来历,三个月后你自己看着都发懵。我见过太多团队在 JSON 配置里硬塞说明字段,比如 "_comment": "这个值不要随便改"。这种别扭的写法不仅污染数据,还会被程序当成真实字段读到,属于典型的狼狈妥协。
1.2 配置文件场景下的真实需求:注释和尾随逗号到底解决什么问题
我们来拆一下这两个需求在配置场景里的意义。
注释解决的是“传承”问题。举个例子,一个 Spring Boot 的 application.json,里面有几十个配置项,其中某个超时时间 "timeout": 30000,为什么是 30000?有没有人知道这是为了配合上游某个 SLA?如果是 JSON,要在别处维护一份 Markdown 文档来解释,配置和解释分离,最终一定有一边会过期。但如果可以在 JSON 里写 // 上游 SLA 要求 P99 不能超过 30s,这个值配合重试策略使用,信息就会跟着配置走,随代码版本一起更新,这才是配置文件该有的形态。
尾随逗号解决的是“编辑体验”问题。比如你维护一个白名单数组,里面列了二十个域名,某次要新增一个,传统 JSON 里你要先找到最后一个,把它的结尾逗号删掉,再换行写上新的,最后补一个逗号。整个操作三步里有两步是冗余劳动,而且还容易出错——手抖一下,最后一个值后面残留逗号,整个文件直接失效。如果支持尾随逗号,你只需要在末尾追加新行,原有的那些行一个都不用碰。这在大厂多人协作的代码评审里尤其重要,因为你每一处改动都可能引发冲突,减少无关 diff 就是对团队负责。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流方案盘点:JSONC、JSON5、YAML、HOCON 到底怎么选
2.1 JSONC:把注释加回去,但仅此而已
JSONC(JSON with Comments)是最朴素的改良方案,核心就是允许在 JSON 中使用 // 和 /* */ 两种注释语法。它并没有修改 JSON 的本体结构,只是在解析时先把注释剥掉,再走传统 JSON 解析。
这个方案最大的价值在于“兼容性缓冲”。很多工具其实已经在私下里支持 JSONC 了,最典型的就是 VS Code。VS Code 的配置文件 settings.json,看起来是 JSON 格式,实际上里面可以写注释。官方引入 JSONC 的原因很实际:不改变现有 JSON 文件的生态地位,去兼容那些已经写了注释的用户文件。
但 JSONC 仍然不允许尾随逗号。究其原因,是尾随逗号的支持需要改动真正的语法解析逻辑,而不仅仅是过滤注释。JSONC 说白了只是一个“预处理器”级别的小打小闹,对尾随逗号这个痛点并无帮助。所以如果你的烦恼主要是“我想在配置里写注释”,JSONC 够用;如果还想舒服地编辑数组成员,那得继续往下看。
2.2 JSON5:超集方案,一次补齐两个痛点
JSON5 是真正的“JSON 超集”,由 Aseem Kishore 在 2012 年左右发起,设计目标就是“让 JSON 更像 JavaScript 对象字面量”。它一次性解决了多个 JSON 的痛点:
- 支持注释,包括单行
//和多行/* */ - 支持尾随逗号,对象和数组都可以
- 支持键名不带引号,比如 `{ name
