【问题标题】:Why can I put comments in some JSON files but not others?为什么我可以在一些 JSON 文件中添加评论,而在其他文件中不能?
【发布时间】:2019-08-06 04:54:48
【问题描述】:

我的 IDE (WebStorm) 允许我将 cmets 放入我的一些 JSON 文件(例如,tsconfig.json.eslintrc.json,但不允许将它们放入其他文件(例如,package.jsonapp.json)。

前者随后在 GitHub 上被标识为“带评论的 JSON”(即使我实际上并没有其中的 cmets)。

为什么我可以将 cmets 放在一些 JSON 文件中而不能放在其他文件中?

【问题讨论】:

    标签: json comments webstorm


    【解决方案1】:

    默认情况下,IDE 检查严格的标准合规性,因为标准 JSON 不允许 cmets。

    我们有一组选项可以在设置 | 中放松合规检查。编辑 |检查,JSON 和 JSON5 |符合 JSON 标准,对于某些文件,检查 cmets 的选项默认关闭(tsconfigtslinteslint 配置),因为相应的工具允许 JSON 格式的 cmets(这是硬编码的)。

    如果您需要将 cmets 添加到某些 JSON 文件,您可以将它们的名称添加到与 JSON5 文件类型相关的模式列表中 Settings |编辑 |文件类型 - JSON5 标准允许 cmets

    【讨论】:

      【解决方案2】:

      您不能将 cmets 放入 JSON 文件中。 JSON 不允许 cmets。请注意,序列化格式有几个微妙不同的变体,都称为“JSON”,但没有一个允许 cmets:

      它们之间有一些细微的差别,但它们都有一个共同点,即不允许使用 cmets。这是设计使然。引用道格拉斯·克罗克福德的话:

      我从 JSON 中删除了 cmets,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性。我知道缺少 cmets 会让一些人感到难过,但它不应该。

      假设您使用 JSON 来保存您想要注释的配置文件。继续并插入您喜欢的所有 cmets。然后通过 JSMin 将其传递给 JSON 解析器。

      但是,一些序列化格式类似于 JSON,允许允许 cmets:

      还有几个 JSON 解析库允许某些样式的 cmets,但没有涵盖所有这些样式的单一正式规范。

      还有YAML - YAML Ain't Markup Language,它是JSON的超集,有cmets。

      为什么我可以将 cmets 放在一些 JSON 文件中而不能放在其他文件中?

      您不能将 cmets 放入 JSON 文件中。但是其中一些文件不是 JSON,它们是允许 cmets 的不同的东西。

      特别是,TypeScript 和 ESLint 碰巧都使用 JSON 解析器,而忽略 cmets 来解析它们的配置文件,一些编辑器、IDE、语法高亮器、语言检测器等知道这一点,并将使用允许的解析器解析这些文件厘米。尽管请注意,由于没有正式的 JSON 与 cmets 规范,因此不能保证被 TypeScript 接受的评论也会被 ESLint 接受,或者 WebStorm 认为会被 TypeScript 接受的评论实际上会被接受。

      如有疑问,请坚持使用正式的标准化格式,例如 YAML、OGDL - Ordered Graph Data LanguageTOML - Tom's Obvious Minimal Language

      【讨论】:

      • 啊,所以基本上我的 IDE 足够聪明,知道某些 JSON(这里是 ESLint 和 TypeScript)的消费者不会介意是否有 cmets。 (而且 Github 基本上是在标记这些文件不是标准的 JSON。)
      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 2021-08-20
      • 2021-06-03
      • 2011-12-12
      • 2012-07-05
      • 1970-01-01
      • 2018-12-24
      • 2020-01-10
      相关资源
      最近更新 更多