JSONC - 带注释的 JSON
JSONC 是什么?
JSONC(JSON with Comments)是 JSON 的一个扩展格式,允许在 JSON 数据中添加注释。这个规范由 jsonc.org 定义,旨在形式化一种在实践中广泛使用但缺乏正式标准的格式。
起源与背景
JSONC 格式最初由微软非正式地引入,用于 VS Code 的配置文件,包括:
settings.json- 编辑器设置launch.json- 调试配置tasks.json- 任务配置
伴随着这种非正式格式,微软发布了一个公开可用的解析器 jsonc-parser。JSONC 规范的目标是将 JSONC 格式形式化,定义 jsonc-parser 在默认配置下认为有效的内容。
语法规则
JSONC 遵循与 JSON 相同的语法规则,并额外支持 JavaScript 风格的注释。
单行注释
单行注释以 // 开始,延伸到行尾:
1 | |
多行注释
多行注释以 /* 开始,以 */ 结束,可以跨越多行:
1 | |
尾随逗号
JSONC 解析器可以支持尾随逗号(Trailing Commas),但并非强制要求。
尾随逗号指出现在数组最后一个元素或对象最后一个属性后的逗号:
1 | |
为什么尾随逗号不是必需的?
根据规范,尾随逗号不是必需的,原因如下:
- 参考实现
jsonc-parser默认情况下不允许尾随逗号 allowTrailingComma选项默认为false,任何尾随逗号都会导致解析错误- 未来当尾随逗号在 JavaScript 生态系统中得到足够普及时,可能会将其纳入规范
VS Code 中的尾随逗号
VS Code 的 “JSON with Comments” 模式曾默认允许尾随逗号,但后来发生了变化:
- 现在仍然接受尾随逗号,但会显示警告
- 例外:VS Code 官方配置文件不会显示警告(因为它们的 JSON Schema 显式允许尾随逗号)
文件扩展名
JSONC 文档的推荐文件扩展名是 .jsonc。
如果使用 .json 扩展名,建议在文件开头添加模式行(Mode Line)来指示这是一个 JSONC 文件:
1 | |
或者:
1 | |
主要用途
JSONC 主要适用于以下场景:
配置文件
JSONC 非常适合配置文件,因为注释可以提供解释或说明:
1 | |
数据标注
JSONC 允许开发者用注释标注 JSON 数据,以便更好地理解和维护:
1 | |
语义
JSONC 中的注释在解析时会被忽略,允许开发者标注 JSON 数据而不影响其结构或内容。
工具和库支持
以下是支持 JSONC 的部分工具和库:
| 语言/平台 | 库 |
|---|---|
| JavaScript/TypeScript | microsoft/node-jsonc-parser |
| C++ | stephenberry/glaze |
| Elixir | massivefermion/jsonc |
| Go | tidwall/jsonc |
| Python | n-takumasa/json-with-comments |
| PHP | otar/jsonc |
| Rust | dprint/jsonc-parser |
| Java | Jackson (JsonFactory.enable(JsonReadFeature.ALLOW_JAVA_COMMENTS)) |
| Kotlin | kotlinx.serialization.json |
JSON vs JSONC 对比
| 特性 | JSON | JSONC |
|---|---|---|
| 单行注释 | ❌ | ✅ |
| 多行注释 | ❌ | ✅ |
| 尾随逗号 | ❌ | 可选支持 |
| 标准化 | RFC 8259 | jsonc.org |
| 典型用途 | 数据交换 | 配置文件 |
参考资料
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.