跳转到内容

Jsonc与注释

严格意义上的 JSON (JavaScript Object Notation) 规范 (RFC 8259) 是不允许注释的。 JSON 被设计为一种纯粹的数据交换格式,力求简洁和机器解析的方便性,因此排除了注释。

那么为什么 VS Code 的 settings.json (以及 keybindings.json, launch.json 等) 可以使用注释 (// 单行注释 或 /* ... */ 多行注释) 并且能正常工作呢?

原因在于:

  1. VS Code 使用了更宽松的解析器: VS Code 在读取这些 .json 配置文件时,并没有使用严格遵守 JSON 规范的解析器。它使用的是一个支持注释的、更宽松的 JSON 解析器。这种带有注释的 JSON 变体通常被称为 JSONC (JSON with Comments)

  2. 配置文件的目的不同: settings.json 的主要目的是供人类阅读和编辑,以配置 VS Code 的行为。在这种场景下,注释对于解释设置项、暂时禁用某项配置或添加备忘录非常有价值,极大地提高了可读性和可维护性。这与 JSON 最初作为机器间数据交换格式的设计目标有所不同。

  3. 内部处理: VS Code 在内部读取 settings.json 文件后,其解析器会先忽略或移除这些注释,然后再将剩余的、符合 JSON 结构的内容解析为配置对象供程序使用。所以,对于 VS Code 的核心逻辑来说,它最终处理的还是有效的 JSON 数据结构,只是在读取文件这一步对注释做了特殊处理。

总结:

VS Code 为了提升用户配置文件的可读性和易用性,在处理其特定的 .json 配置文件(如 settings.json)时,特意采用了支持注释 (JSONC) 的解析方式,这是一种对严格 JSON 规范的扩展。虽然这不符合纯粹的 JSON 标准,但在配置文件这个特定场景下是非常实用和人性化的设计。

需要注意的是,如果你尝试将带有注释的 settings.json 文件直接提供给一个只接受严格标准 JSON 的外部程序或服务,它很可能会因为遇到注释而解析失败。