可以在 JSON 中使用注释吗?

我可以在 JSON 文件中使用注释吗?如果是这样,怎么办?

答案

没有。

JSON 应该都是数据,如果包含注释,那么它也将是数据。

您可能有一个名为"_comment" (或其他名称)的指定数据元素,使用 JSON 数据的应用程序会忽略该数据元素。

在生成 / 接收 JSON 的过程中添加注释可能会更好,因为它们应该事先知道什么是 JSON 数据,或者至少知道其结构。

但是,如果您决定:

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

,形式的意见//…/*…*/没有在 JSON 不允许的。该答案基于:

  • http://www.json.org
  • RFC 4627 :JavaScript 对象符号(JSON)的application/json媒体类型
  • RFC 8259 JavaScript 对象表示法(JSON)数据交换格式(取代 RFC 4627、7158、7159)

如果选择,请添加评论;在解析或传输之前,先用减法器将其剥离。

我刚刚发布了JSON.minify() ,它从 JSON 块中删除了注释和空格,并使之成为可以解析的有效 JSON。因此,您可以像这样使用它:

JSON.parse(JSON.minify(my_str));

当我发布它时,我什至遭到了人们的强烈反对,甚至对此想法也持反对意见,因此我决定写一篇关于为什么在 JSON 中有意义的博客文章。它包含 JSON 创建者的以下著名注释:

假设您正在使用 JSON 保留要注释的配置文件。继续并插入您喜欢的所有评论。然后将其通过 JSMin 传递给 JSON 解析器。 - 道格拉斯 · 克罗克福德Douglas Crockford),2012 年

希望这对那些不同意为什么JSON.minify()可能有用的人有所帮助。

根据设计,注释已从 JSON 中删除。

我从 JSON 中删除了注释,因为我看到人们正在使用它们保留解析指令,这种做法会破坏互操作性。我知道缺少评论会使某些人感到难过,但事实并非如此。

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

资料来源: 道格拉斯 · 克罗克福德(Douglas Crockford)关于 Google + 的公开声明

免责声明:您的保修无效

正如已经指出的那样,这种黑客利用了规范的实现。并非所有 JSON 解析器都会理解这种 JSON。流解析器尤其会阻塞。

这是一个有趣的好奇心,但是您真的不应该将它用于任何用途 。以下是原始答案。


我发现了一个小技巧,可让您在不影响解析的 JSON 文件中放置注释,或以任何方式更改表示的数据。

似乎在声明对象文字时,可以使用相同的键指定两个值,最后一个优先。信不信由你,它证明了 JSON 解析器的工作原理相同。因此,我们可以使用它在源 JSON 中创建注释,这些注释将不会出现在已解析的对象表示中。

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

如果我们应用此技术,则您注释的 JSON 文件可能如下所示:

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

上面的代码是有效的 JSON 。如果您解析它,您将得到一个这样的对象:

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

这意味着没有评论的痕迹,并且它们不会有怪异的副作用。

骇客入侵!

JSON 不支持注释。也从未打算将其用于需要注释的配置文件。

Hjson 是人类的配置文件格式。轻松的语法,更少的错误,更多的注释。

Hjson简介

有关 JavaScript,Java,Python,PHP,Rust,Go,Ruby 和 C#库的信息,请参见hjson.org

考虑使用 YAML。它几乎是 JSON 的超集(几乎所有有效的 JSON 都是有效的 YAML),并且允许注释。

你不能至少快速浏览一下json.org是我的经验。

JSON 在该页面上显示了其语法。没有关于注释的任何注释。

您应该改为编写JSON 模式 。 JSON 模式是当前提议的 Internet 草案规范。除了文档之外,该模式还可以用于验证 JSON 数据。

例:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

您可以通过使用描述架构属性来提供文档。

如果您将Jackson用作 JSON 解析器,则可以通过以下方式启用它以允许注释:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

然后,您可以有如下评论:

{
  key: "value" // Comment
}

您还可以通过设置以下内容以#开头的注释:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

但是总的来说(如前所述),该规范不允许发表评论。