题 可以在JSON中使用注释吗?


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


5797
2017-10-28 20:39


起源


@StingyJack:解释可能不明显的事情,或其他任何可能与评论有关的事情。我经常在数据文件中有注释。 XML,ini文件和许多其他格式包括注释条款。 - Michael Burr
如果你像我一样,想知道是否 //comments 对于Sublime Text配置文件的特定用例是可以的,答案是肯定的(从版本2开始)。 Sublime Text不会抱怨它,至少,它会抱怨 {"__comment": ...} 在控制台中,因为它是一个意外的领域。 - hangtwenty
也许这就是TOML创建的原因之一.. - Alex Nolasco
略有讽刺,但我也尝试使用//在JSON中发表评论。现在我意识到它严格用于交换/交换。叹!我不能再评论了:(。生命注定要失败! - Sid
JSON5支持评论: stackoverflow.com/a/7901053/108238 - schoetbi


答案:


没有。

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"
            }
         }
      }
   }
}

4066
2017-10-28 21:01



如果有一个名为comment的有效字段,可能需要在实际注释上加上某种前缀: "__comment":"comment text goes here...", - Rob Fonseca-Ensor
最近解释/理由为什么JSON中没有注释(或更准确地说,为什么它们在早期被删除): plus.google.com/118095276221607585885/posts/RK8qyGVaGSr 另见, tech.groups.yahoo.com/group/json/message/156 和该线程中的其他讨论。 - Michael Burr
BTW,Java的json库 谷歌,GSON支持评论。 - centic
如果我想对此单独发表评论怎么样? Accronym 和 Abbrev 属性?我之前使用过这种模式但是停止了,因为它不允许我这样做。这是一个黑客。也许如果我在前面添加一个属性名称 __comment__ 代替。这是“__comment__Abbrev”,仍然是一个黑客,但我会评论所有的prpoerties - Juan Mendes
你也可以使用“//”:这看起来更原生,并且在同一个父级中仍然是可重复的 - smnbbrv


没有,表格的评论 //… 要么 /*…*/ JSON中不允许使用。这个答案基于:

  • http://www.json.org
  • RFC 4627: 该 application/json JavaScript对象表示法的媒体类型(JSON)
  • RFC 7159 JavaScript Object Notation(JSON)数据交换格式 - 已废弃:4627,7158

1569
2017-11-15 09:32



如果你想用注释注释你的JSON(从而使它成为无效的JSON),那么在解析或传输之前将其缩小。 Crockford本人在2012年在配置文件的背景下承认了这一点。 - toolbear
@alkuzad:当谈到正式语法时,必须有一些明确说明它们的东西 是 允许,而不是相反。例如,选择您的编程语言:仅仅因为未明确禁止某些期望(但缺失)的功能,并不意味着您的编译器会神奇地识别它。 - stakx
是。 JSON格式在元素之间有很多死区,并且在这些区域中对空间不敏感,因此没有理由不能在那里使用单行或多行注释。许多解析器和minifiers也支持JSON注释,因此请确保您的解析器支持它们。 JSON用于应用程序数据和配置设置,因此现在需要注释。 “官方规格”是一个不错的主意,但它不够,过时,太糟糕了。如果您担心有效负载大小或性能,请缩小您的JSON。 - Triynko
虽然你的答案绝对正确,但应该说这是BS。由于有如此多的最终用户需要json配置,因此评论非常有用。只是因为一些锡箔帽决定了JSON 是 和 必须永远 机器可读,忽略了人类需要阅读它的事实,这是一种小心眼的嘲弄。 - cmroanirgo
@cmroanirgo:你显然不是第一个抱怨JSON限制的人......这就是为什么我们有解析器静默允许注释,以及其他格式如YAML和JSON5。然而,这并没有改变JSON就是这样的事实。更确切地说,我觉得有趣的是,人们开始使用JSON的目的在一开始就显然是不够的,考虑到这个限制。不要责怪JSON格式;责备自己坚持使用它不是特别合适的地方。 - stakx


如果您选择,请附上评论;在解析或传输之前用缩小器将它们剥离。

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

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

当我发布它的时候,我得到了一个强烈反对,甚至不同意它的想法,所以我决定写一篇关于为什么的综合博客文章 评论在JSON中有意义。它包括来自JSON创建者的这个值得注意的评论:

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

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


678
2018-06-23 18:20



我对JSON.minify()唯一的问题是它真的很慢。所以我做了自己的实现,做了同样的事情: gist.github.com/1170297 。在一些大型测试文件上,您的实现需要74秒,并且需要0.06秒。 - WizKid
如果您可以将建议的替代算法提交给JSON.minify()的github repo,那就太棒了,这样它就可以移植到所有支持的语言中: github.com/getify/json.minify - Kyle Simpson
@MiniGod我已经多次听过Doug关于这个话题的想法了。我很久以前在我的博文中对他们说过: blog.getify.com/json-comments - Kyle Simpson
@ MarnenLaibow-Koser即使对于数据流(甚至数据包)的使用,仍然有用于评论:包含创建时间或源等诊断元数据是XML的常用方法,对JSON数据也非常敏感。针对注释的争论很浅,任何文本数据格式都应该允许注释,而不管隐含的预期用法(没有任何规范建议JSON不能在其他地方使用,fwiw) - StaxMan
如果JSON要得到普遍接受(它基本上是这样做的话)那么它应该具有通用的应用程序。示例:JSON可以充当应用程序配置文件。这个应用程序需要评论。 - eggmatters


评论已从JSON中删除。

我从JSON中删除了注释,因为我看到有人使用它们来保存解析指令,这种做法会破坏互操作性。我知道缺乏评论会让一些人感到悲伤,但事实并非如此。

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

资源: 道格拉斯克罗克福德在G +上的公开声明


379
2018-06-11 08:52



我认为JSON应该比XML更人性化?评论是为了便于阅读。 - intrepidis
无论如何,你可能会调皮并在JSON中添加解析指令:{“_ _ directives”:{“#n#”:“DateTime.Now”},“validdate”:“#n#”} ...看起来像YAML是前进之路...... - intrepidis
个人意见:不允许评论蹩脚。除了构建一个忽略注释的非标准JSON解析器,解码我的配置文件之外别无选择。 - caiosm1005
@ArturCzajka我仍然不喜欢JSON不支持评论这一事实,但我试试了INI,我必须承认将它们用于配置文件的JSON更有意义。感谢您的回复,希望更多人在阅读此对话时会改变主意。 (无论如何,使解析器更像是一种练习:) - caiosm1005
这就像要求所有自行车都有训练轮,因为有些人不能骑自行车。删除一个重要的功能,因为愚蠢的人滥用它是一个糟糕的设计。数据格式应优先考虑可用性,而不是防止白痴。 - Phil Goetz


免责声明:您的保修是无效的

正如已经指出的那样,这个hack利用了规范的实现。并非所有JSON解析器都能理解这种JSON。流式解析器尤其会窒息。

这是一个有趣的好奇心,但是你 真的不应该用它来做任何事情。以下是原始答案。


我发现了一个小的hack,它允许你将注释放在一个不会影响解析的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]
}

这意味着没有评论的痕迹,他们不会有奇怪的副作用。

快乐的黑客!


192
2017-08-02 13:46



从 规范:对象中的名称应该是唯一的。 - Quentin
“所有的实现都处理它” - 这是一个难以证明的事情。 - Quentin
JSON中的元素顺序无法保证。这意味着“最后”项目可能会改变! - sep332
这显然违反了规范(见上面的评论),不要这样做。 ietf.org/rfc/rfc4627.txt?number=4627 - voidlogic
没有  - 如果解析器正在流式传输怎么办?如果解析器将其读入未定义键排序的字典,该怎么办? 用火杀死它。 - deanWombourne


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

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

Hjson intro

看到 hjson.org 适用于JavaScript,Java,Python,PHP,Rust,Go,Ruby和C#库。


123
2018-03-20 15:26



Upvoted。这显然是一个很好的变化,不开放的保守派人士会喜欢讨厌。我希望你的实现得到进一步了解 - 甚至可能比原版更受欢迎;)我希望有人也可以用Ruby实现它。 @adelphus明确定义的语言是您自己的观点或观点。如果你是一个保守的“开发者”并不能证明你更好,你可能会更糟,让自己被关在有限的空间里。不要轻易将人们视为糟糕的开发者。 - konsolebox
抱歉,@konsolebox。或许你可能会在阅读后重新考虑你的“明确定义的JSON是你的意见” ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 这是一个真正的标准,开发人员实现自己的“特殊”版本会导致碎片化,混乱和大量浪费时间。看看开发人员在编写代码时留下的混乱,因为每个浏览器都实现了略有不同的标准版本。 JSON语言可能并不完美,但碎片化程度更差。是的,这只是一个意见,你可以自由地反对意见。 - adelphus
我很佩服你的祝福,但你有点重新发明了YAML。如果你想要很多灵活性和人类可读性,请使用YAML(实际上不要: stackoverflow.com/questions/450399/...)或坚持使用curmudgeony,但明确的JSON。 - toolbear
我发现最用户友好的配置格式仍然是INI。它很简单,而且语法不重。这使得用户只需在配置池中浸泡脚趾就不那么令人生畏了。 - Matt
每当你需要json作为配置(评论 是 需要) - 将文件命名为“.js”而不是“.json”.. js当然可以处理任何有效的json对象 能够 处理注释..这就是为什么它是“webpack.config.js”而不是“webpack.config.json”的原因(那么在webpack中也有更多的原因:P) - jebbie


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

JSON的语法在该页面上可视化。关于评论没有任何说明。


95
2017-10-28 20:42





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


86
2017-08-31 02:24



@ g33kz0r正确,因此我将YAML描述为JSON的近似超集。 - Marnen Laibow-Koser
@NateS许多人已经指出答案是否定的。我提出了一个更好的方法来实现OP的目标。这是一个答案。 - Marnen Laibow-Koser
下行: yaml 库不附带Python。 - Bleeding Fingers
@BleedingFingers所以安装它...... - Marnen Laibow-Koser
@ marnen-laibow-koser:是的,使用Java和Perl的可用YAML库一定是不称职的,并期望每个人生成的YAML被其他人使用而没有错误。 YAML互操作是一个问题,但JSON互操作不是,完全可以解释为我缺乏知识。 - toolbear


你应该写一个 JSON模式 代替。 JSON模式目前是一个提议的Internet草案规范。除了文档,架构还可用于验证您的JSON数据。

例:

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

您可以使用以下方式提供文档 描述 架构属性。


55
2017-07-28 18:38



JSON架构是否存活?它存在但是它是否受到任何已知库的支持? - Munhitsu
是的 json-schema google组 相当活跃,我会建议 JSV 用于JSON Schema验证器的良好JavaScript实现。 - raffel
这仅对结构化文档有帮助,而不是临时文档 - Juan Mendes
如果你使用clojure(我确定你没有),这里有一个相当特色的开源JSON模式解析器: github.com/bigmlcom/closchema - charleslparker
@Munhitsu Manatee.Json(.Net)广泛支持JSON模式。 - gregsdennis


如果你正在使用 杰克逊 作为您的JSON解析器,这是您启用它以允许注释的方式:

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

然后你可以有这样的评论:

{
  key: "value" // comment
}

你也可以从评论开始 # 通过设置:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);    

但总的来说(如前所述)规范不允许评论。


51
2018-02-06 20:44



在我尝试时打开该链接超时: The connection to the server was reset while the page was loading. - Peter Mortensen