为什么 VS Code 允许在 .vscode 内的 JSON 文件中进行评论,而在其他地方不允许?

Why does VS Code allow comments in JSON files within .vscode but not elsewhere?

我正在完成一个正在进行的项目,我正在文件中做笔记以解释现有代码的用途。我注意到的一件事是 VS Code 允许(甚至附带)对 .vscode 文件夹中的 JSON 文件进行注释。这里是 .vscode/extensions.json.

但是如果我尝试在其他地方的 JSON 文件中添加评论,我会被告知不允许评论。

我了解如何使用自定义设置解决此问题,但这基本上是 Microsoft 违反规则并允许在 JSON 中进行评论,尽管 JSON 不允许评论, 但在它不会读取的文件中强制执行评论禁令?

而且,由于虽然 Microsoft 可能允许他们正在阅读 JSON 中的评论,但阅读其他 JSON 配置文件的人可能不允许,我想我应该远离他们 .vscode?



VSC 在配置为支持注释的每个 JSON 文件中支持注释



JSON 文件中的注释支持不取决于文件位置或路径名语义,而是取决于解析它的解析器(更多关于解析器的信息)。 JSON 中的支持评论远非 VSCode 所独有,当然也不是 VSCode 目录 ./.vscode/ 所独有。 JSON 中的评论支持是 VSCode 中包含的一项功能,无需第三方软件、扩展或任何其他形式的可扩展软件即可使用。我经常在我的eslintrc.json里写注释,不需要任何非默认配置就可以支持。另一个支持评论的 JSON 文件,我在 VSCode 的 Theme JSON-Files 中工作时会利用它,这是 VS-Code Extensions & Themes 使用的文件,位于 ".../user/vscode/extensions/<some-theme-name>/themes/<some-theme-name>.json"(<-- 记住当你阅读路径名时我是 Linux 人)。


VSCode 还做了一些您可能会注意到的其他事情,它使用与支持 JSON 文件中的注释相同的概念来实现。 VS-Code 有时会将非 JSON 文件视为 JSON 文件。它使用 .prettierrc.babelrc 和许多其他方法执行此操作。通过支持 Dot-.(*.)rc 配置文件为 JSON,它们可以被格式化为 JSON..

ECMA-404

因为 JSON 是一个开放标准,所以基于文本的语法有很多不同的实现。有些完全符合 ECMA-404 标准化,有些仅部分符合,但是,ECMA JSON 标准的部分表示在开发社区中通常仍被称为 JSON。某些项目 and/or 公司不完全符合 JSON 标准的主要原因是向语法添加功能或语义。

如果 JSON 不是开放标准,VS 代码可能不会在法律上允许创建 JSON 的自定义表示。只是因为 JSON 是 ECMA 标准,所以 VSCode 能够做到这一点。这就是为什么 JSON、ECMA 和 VSCode 如此出色,他们使用所有人都可以使用的工具和资源。

这就是 VSCode 在其 JSON 文件中支持评论的方式:

通常,当向 JSON 表示添加功能时,表示将采用唯一名称,该名称几乎总是与其文件扩展名相同(也是新的和唯一的)。真实世界的例子是 (JSONC & JSON5)。添加新扩展的原因是需要有不止一种类型的 JSON 解析器来处理 JSON 文件。 VSCode 需要能够解析 Standard JSON,如您所知,它解析 JSONC (JSON W/ Comments),因此编辑器必须实现以下 2解析器:

#1 JSON

   The first parser JSON is a standardized JSON parser that conforms 100% to the standardization implemented by the ECMA-404(2017) document. The JSON parser parses all files in VSCode that end with the .json file extension (unless instructed not to by the editors configuration). This parser throws an Error when it attempts to parse a comment.

#2 JSONC

第二个解析器是 JSONC(JSON W/注释)。它负责解析所有使用 .jsonc 文件扩展名的文件。这被认为是不符合 JSON (processor/parser) 的解析器,但是,此解析器确实支持注释。

配置 VS-Codes JSON 解析器以将 JSON 解析为 JSONC


    //  FILE: "./.vscode/settings.json"
   
    // Example A
    "files.associations": {
        "*.json": "jsonc"
    },

    // Example B
    "files.associations": {
        "file-name-here.json": "jsonc" 
    }


以上示例演示了在我看来,在与 VSCode 一起使用的 JSON 文件中添加注释支持的最佳方式。


1。示例 A

示例 A,声明 JSON 文件与 JSONC 文件类型相关联。这告诉 VS-Code 使用 JSONC 解析器来解析 JSON 文件。

2。示例 B

示例 B 将特定文件声明为与 JSONC 文件类型关联。就像在示例 A 中一样,VS-Code 现在知道使用 JSONC 解析器解析该文件。



这些图像演示了 "files.associations": {...} 在前后图像对中的使用。

您可以使用设置...

"files.associations": {...}

...不同用途的完整列表。一种这样的用途是向不使用 .json ext 但实现标准 JSON 语法的文件添加 JSON 支持。 `"files.associations" 的大多数用例是针对非 JSON 的东西。对于任何勤奋使用 VS-Code 的人来说,这是一个非常好的工具。
在我走之前,我需要提一下...

陷阱

JSON 并不总是缺乏对评论的支持。在 JSON 的初始定义标准化后,注释支持已从中删除。删除它们的原因来自 Douglas Crockford — 因 JSON 的成功而受到赞誉的人 — 引用他的话说,是从 JSON 中删除评论的原因,如

所述

    I removed comments from JSON because I saw people were using them to hold parsing directives, a practice which would have destroyed interoperability.

换句话说,人们在指示要解析他们的 JSON 的解析器。这使得包含指令的文件无法在使用不同平台的另一个系统中运行。

上面说的非常好,应该注意的是评论也提出了类似的问题。如果您支持 JSON 中的评论,并尝试在另一个环境中使用该 JSON 文件,例如不同的编辑器,您必须确保该编辑器也支持评论。这对您来说很简单,因为您会记住文件中的内容,或者至少记住其中的大部分内容。但是,当您将 JSON 文件传递​​给试图在不打开文件的情况下对其进行解析的人时,他们可能会遇到错误并且不知道原因。由于这些,我们需要小心我们添加注释支持的 JSON 文件。