可以在JSON中使用注释吗?

Can comments be used in JSON?

提问人:Michael Gundlach 提问时间:10/29/2008 最后编辑:Mateen UlhaqMichael Gundlach 更新时间:9/30/2023 访问量:3499789

问:

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

JSON 注释

评论

212赞 Michael Burr 10/29/2008
@StingyJack:解释可能不明显的事情,或者人们可能对评论做的任何事情。我经常在数据文件中发表评论。XML、ini 文件和许多其他格式都包含注释规定。
41赞 floer32 2/1/2013
如果您像我一样,想知道是否适合 Sublime Text 配置文件的特定用例,答案是肯定的(从版本 2 开始)。Sublime Text 至少不会抱怨它,而它会在控制台中抱怨,因为它是一个意想不到的字段。//comments{"__comment": ...}
36赞 schoetbi 2/2/2015
JSON5 支持注释: stackoverflow.com/a/7901053/108238
25赞 Dominic Cerisano 11/20/2019
“我从JSON中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性。我知道缺乏评论会让一些人感到难过,但不应该。 - Douglas Crockford(JSON 作者),2012 年
14赞 SMBiggs 11/21/2020
想象一下锤子的发明者。他可能想把石头打成斑点,用来制造刀和斧头。如果他坚持认为他的工具不能用于其他任何事情,比如打攻击你的人,或者把小麦变成面粉,或者钉钉子,我们仍然处于石器时代。假设这是我的方式或什么都不是,这是傲慢的高度。忽略注释是一个很好的例子,假设这个工具永远不会有其他用途,而不是机器/程序之间的数据通信。这种缺乏远见是可耻的。

答:

146赞 Cheery 10/29/2008 #1

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

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

7029赞 Eli 10/29/2008 #2

不。

JSON 是纯数据的。如果包含注释,则它也必须是数据。

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

在生成/接收 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"
            }
         }
      }
   }
}

评论

304赞 Rob Fonseca-Ensor 2/3/2010
在实际注释上添加某种前缀可能会有所帮助,以防有一个名为 comment 的有效字段:"__comment":"comment text goes here...",
39赞 centic 10/1/2012
顺便说一句,Java 的 json 库 google-gson 支持注释。
18赞 Ruan Mendes 8/11/2014
如果我想对 和 属性进行单独的评论怎么办?我以前使用过这种模式,但停止了,因为它不允许我这样做。这是一个黑客。也许如果我在属性名称前面加上一个。那是“__comment__Abbrev”,仍然是一个黑客,但让我评论所有 prpoertiesAccronymAbbrev__comment__
66赞 smnbbrv 8/28/2015
您也可以使用“//”:这看起来更原生,并且仍然可以在同一父级中重复
27赞 Петър Петров 2/27/2016
当 JSON 用于人类预期的配置文件时,应该对它们进行注释,以便人们更好地理解。带注释的,这样的文件不再是有效的 JSON,但有解决方案。例如,Google 的 GYP 支持 # 样式的评论。JSON格式。缩小将帮助您从输入文件中丢弃 C/C++ 样式的注释。
44赞 Neil Albrock 10/29/2008 #3

JSON 背后的理念是在应用程序之间提供简单的数据交换。这些通常是基于 Web 的,语言是 JavaScript。

它实际上并不允许这样的注释,但是,将注释作为数据中的名称/值对之一传递肯定会起作用,尽管该数据显然需要被解析代码忽略或专门处理。

综上所述,这并不是说JSON文件应该包含传统意义上的注释。它应该只是数据。

有关更多详细信息,请查看 JSON 网站

评论

28赞 StaxMan 9/2/2009
确实,JSON格式没有注释。我个人认为这是一个重大错误——将注释作为元数据(而不是数据)的能力对于 xml 来说非常有用。JSON规范的早期草案版本确实包含注释,但由于某种原因,它们被删除了。:-/
7赞 Camilo Martin 12/11/2010
@StaxMan,它们之所以被删除,正是因为人们开始将它们用作元数据。克罗克福德说,它破坏了格式设计的兼容性,我同意:如果你想要元数据,为什么不把它作为实际数据包括在内呢?以这种方式进行解析甚至更容易。
8赞 Marnen Laibow-Koser 9/6/2011
元数据属于元数据结构(例如.HTML <元>标签),而不是注释。滥用元数据注释只是在不存在真正的元数据结构的情况下使用的一种技巧。
51赞 John T. Vonachen 4/10/2010 #4

如果您的文本文件(JSON 字符串)将被某个程序读取,那么在使用之前去除 C 或 C++ 样式的注释有多困难?

答:这将是一行。如果这样做,则可以将 JSON 文件用作配置文件。

评论

3赞 Orbling 2/25/2011
可能是迄今为止最好的建议,尽管将文件保留为交换格式仍然是一个问题,因为它们在使用前需要预处理。
0赞 Lawrence Dol 7/28/2012
我同意并用 Java 编写了一个 JSON 解析器,可在 www.SoftwareMonkey.org 获得,它正是这样做的。
3赞 stofl 7/27/2013
尽管我认为扩展 JSON(不称其为不同的交换格式)不是一个好主意:确保忽略字符串中的“注释”。{ “foo”: “/* 这不是评论。
30赞 Kyle Simpson 12/9/2013
"...将是一行“嗯,不,实际上,JSON 不是一种常规语法,其中正则表达式可以简单地找到匹配的 /* 对。你必须解析文件,以查找 /* 是否出现在字符串中(并忽略它),或者它是否被转义(并忽略它)等。此外,你的答案是无济于事的,因为你只是(错误地)推测,而不是提供任何解决方案。
1赞 8/8/2014
@kyle辛普森说了什么。此外,他太谦虚了,无法引导读者找到他自己关于使用 JSON.minify 作为临时正则表达式的替代方案的答案。做那个,而不是这个。
1001赞 Kyle Simpson 6/24/2010 #5

如果您愿意,请添加评论;在解析或传输之前,用缩小器将它们剥离。

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

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

当我发布它时,我遭到了人们的强烈反对,甚至不同意它的想法,所以我决定写一篇全面的博客文章,说明为什么评论在JSON中是有意义的。它包括来自 JSON 创建者的这条值得注意的评论:

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

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

评论

187赞 WizKid 8/25/2011
我对 JSON.minify() 的唯一问题是它真的很慢。所以我做了我自己的实现,做同样的事情:gist.github.com/1170297 。在一些大型测试文件上,您的实现需要 74 秒,而挖掘需要 0.06 秒。
75赞 Kyle Simpson 8/31/2011
如果您可以将建议的替代算法提交到 JSON.minify() 的 github 存储库,以便它可以移植到所有支持的语言,那就太好了: github.com/getify/json.minify
21赞 Kyle Simpson 2/27/2013
@MiniGod我已经多次听到道格对这个话题的看法。我很久以前在我的博客文章中谈到了他们:blog.getify.com/json-comments
27赞 StaxMan 3/29/2014
@MarnenLaibow-Koser,即使对于数据流(甚至数据包)的使用,注释仍然有效:包含诊断元数据(如创建时间或来源)是XML的常见用途,对于JSON数据也是非常明智的。反对注释的论点是肤浅的,任何文本数据格式都应该允许注释,无论隐含的预期用途如何(没有任何规范表明 JSON 不能在其他地方使用,fwiw)
31赞 eggmatters 1/28/2016
如果JSON要被普遍接受(它基本上是这样做的),那么它应该具有普遍的应用。示例:JSON 可以用作应用程序配置文件。此应用程序需要注释。
93赞 raffel 7/29/2010 #6

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

例:

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

您可以使用 description 架构属性提供文档。

评论

2赞 raffel 11/27/2012
是的,json-schema google 组相当活跃,我建议将 JSV 用于 JSON Schema 验证器的良好 JavaScript 实现。
0赞 charleslparker 4/15/2013
如果你使用 clojure(我敢肯定你不这样做),这里有一个功能合理的开源 JSON 模式解析器:github.com/bigmlcom/closchema
0赞 gregsdennis 6/26/2015
@Munhitsu Manatee.Json (.Net) 广泛支持 JSON 模式。
0赞 jgmjgm 12/8/2017
这并不适用于所有情况。我有一个手动配置的 JSON,由具有自己架构的其他东西(包管理器)解析。我想要一个注释,例如 /* 最好使用另一个包管理器中的 X,但是该管理器还没有提供 X。*/.
2152赞 stakx - no longer contributing 11/15/2010 #7

可以,不允许在 JSON 中使用表单或注释。这个答案是基于://…/*…*/

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

评论

94赞 8/8/2014
如果您想使用注释注释 JSON(从而使其无效 JSON),请在解析或传输之前将其缩小。Crockford 本人在 2012 年的配置文件上下文中承认了这一点。
39赞 stakx - no longer contributing 9/28/2015
@alkuzad:当涉及到形式语法时,必须有一些东西明确地说它们是允许的,而不是相反。例如,以你选择的编程语言为例:仅仅因为某些想要的(但缺少的)功能没有被明确禁止,并不意味着你的编译器会神奇地识别它。
15赞 Triynko 11/1/2017
是的。JSON 格式在元素之间有很多死区,并且在这些区域中对空间不敏感,因此没有理由不能在那里使用单行或多行注释。许多解析器和压缩器也支持 JSON 注释,因此只需确保您的解析器支持它们即可。JSON 被大量用于应用程序数据和配置设置,因此现在需要注释。“官方规范”是个好主意,但它不够用且过时了,太糟糕了。如果您担心有效负载大小或性能,请缩小 JSON。
116赞 cmroanirgo 1/21/2018
虽然你的答案是绝对正确的,但应该说这是BS。由于有如此多的最终用户需要 json 配置,因此注释非常有帮助。仅仅因为一些锡箔帽决定JSON是而且必须始终是机器可读的,而忽略了人类需要读取它的事实,恕我直言,这是对狭隘思想的嘲弄。
36赞 stakx - no longer contributing 1/21/2018
@cmroanirgo:你显然不是第一个抱怨JSON局限性的人......这就是为什么我们有静默允许评论的解析器,以及其他格式,如 YAML 和 JSON5。但是,这并不能改变JSON的事实。相反,我发现有趣的是,人们开始将 JSON 用于最初显然不够的目的,因为存在相关限制。不要责怪JSON格式;责怪我们自己坚持在不太合适的地方使用它。
28赞 David 1/19/2011 #8

Dojo Toolkit JavaScript 工具包(至少从 1.4 版开始)允许您在 JSON 中包含注释。注释可以采用格式。Dojo Toolkit 通过调用使用 JSON。/* */dojo.xhrGet()

其他 JavaScript 工具包可能以类似的方式工作。

在选择最终选项之前尝试替代数据结构(甚至数据列表)时,这会很有帮助。

评论

4赞 8/8/2014
不。不是这个。JSON 没有注释。如果选择使用注释注释 JSON,请在解析或传输之前将其缩小。这不应该是接收者的责任。
3赞 David 8/8/2014
我没有说JSON有注释。我也不是要暗示将它们包含在您的 JSON 中是合适的,尤其是在生产系统中。我说过 Dojo 工具包允许你添加它们,这是(或至少是)事实。在测试阶段,有一些非常有用的用例可以做到这一点。
1赞 8/9/2014
提供评论是糟糕的巫术,因此无效的 JSON,这隐含地鼓励了接受。dojo.xhrGet()
0赞 Craig Tullis 9/15/2014
我仍然投票支持升级 JSON 规范以允许评论。我完全赞成在传输 JSON 之前缩小和剥离注释,但没有任何能力以任何标准方式注释您的 JSON,而不必在解析之前通过单独的实用程序传递它,这似乎很愚蠢。我还使无法在 JSON 配置文件上使用 JSON 编辑器,因为您的文件不是有效的 JSON。
37赞 peterk 6/22/2011 #9

我只是在配置文件中遇到这种情况。我不想使用XML(冗长,图形,丑陋,难以阅读)或“ini”格式(没有层次结构,没有真正的标准等)或Java“属性”格式(如.ini)。

JSON可以做他们能做的所有事情,但它不那么冗长,更易于人类阅读 - 而且解析器在许多语言中都很简单且无处不在。它只是一棵数据树。但是,带外注释通常是必要的,用于记录“默认”配置等。配置从来都不是“完整文档”,而是保存的数据树,在需要时可以由人类读取。

我想可以将 ,用于“有效”JSON。"#": "comment"

评论

5赞 Marnen Laibow-Koser 10/20/2011
对于配置文件,我建议使用 YAML,而不是 JSON。它(几乎)是更强大的 JSON 超集,但也支持更具可读性的构造,包括注释。
0赞 nealmcb 3/21/2012
@Hamidam 有十几种语言支持 yaml: yaml.org - 但你问有多少语言内置了支持,而不需要第三方库依赖项,这是对的。看起来 Ruby 1.9.2 确实如此。有人知道其他人吗?哪些语言默认支持 json?
5赞 8/8/2014
YAML 互操作是谎言:stackoverflow.com/questions/450399/......如果你的直觉是将 JSON 用于配置文件,请遵循它。
0赞 idbrii 10/13/2023
Yaml 得到了广泛的支持,但规范很复杂,会导致错误和任意代码执行。YAML:可能没那么好毕竟noyaml,而来自地狱的yaml文档记录了yaml的缺陷。
197赞 Marnen Laibow-Koser 8/31/2011 #10

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

评论

21赞 Marnen Laibow-Koser 3/28/2014
@NateS 许多人已经指出答案是否定的。我提出了一个更好的方法来实现OP的目标。这是一个答案。
6赞 8/18/2014
@marnen-laibow-koser:是的,使用可用的 Java 和 Perl 的 YAML 库并期望每个库生成的 YAML 都能被另一个使用而不会出错,这一定是无能的。YAML 互操作是一个问题,但 JSON 互操作不是,这完全是由于我缺乏知识。
4赞 8/25/2014
@marnen-laibow-koser,一种以更简单的规范完成同样事情的格式会更好。具有完美实现的实用格式比具有不完美实现的理想格式更好。并非所有错误库的责任都落在实现者的肩上;YAML 规范很长、很密集、很钝。它的维基百科条目引用了两个模棱两可的例子;如果必须在人和格式之间放置一个发射器来保护他们免受歧义的影响,那么格式就失去了对人类友好的主张。JSON 要求较少,并且大多数成功,而 YAML 要求更多但不足。
3赞 8/25/2014
@marnen-laibow-koser,我已经驳斥了你对我自己无能的暗示,用细节支持了我的主张,并稍微阐述了我的偏好/偏见,这些偏好/偏见为我的 YAML 批评提供了信息。我自己的进一步评论可能会带来递减的回报。我相信未来的读者有能力做出明智的选择。除了回避人身攻击之外,谢谢你的发言。如果你愿意,最后一句话就是你的了。
4赞 Marnen Laibow-Koser 9/13/2014
@toolbear 没有故意进行人身攻击。“具有完美实现的实用格式比具有不完美实现的理想格式更好”——我不确定我是否同意。如果格式是理想的(并且是可实现的),那么人们总是可以做出一个好的实现。如果格式不理想,那么即使是完美的实现也不会很好。:)“YAML 规范很长、很密集、很钝”——这实际上并不是“钝”的意思,但 YAML 规范非常清楚。我在维基百科中没有看到任何歧义;如果我错过了什么,请引用文章的特定部分。
126赞 schoetbi 10/26/2011 #11

注释不是官方标准,尽管某些解析器支持 C++ 样式的注释。我使用的一种是 JsonCpp。在示例中,有这个:

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint 不会验证这一点。因此,注释是特定于解析器的扩展,而不是标准。

另一个解析器是 JSON5

JSON TOML 的替代方案。

另一种选择是 jsonc

最新版本的 nlohmann/json 可选支持忽略解析时的注释。

评论

0赞 izrik 11/7/2015
Groovy 有一些用于处理 JSON 的内置类。JsonSlurper 可以处理注释。当然,官方规范中不允许注释,因此任何解析器中的这种行为都是非标准且不可移植的。
1赞 Max 4/17/2020
Newtonsoft Json.NET 也支持 C 样式的注释,没有问题
0赞 Coderer 11/12/2021
恕我直言,这是这个问题的最佳答案,因为它包含许多确实有支持的替代解析器的良好列表。不应鼓励使用重复或无关密钥的黑客攻击,如果您想要/需要注释,则应使用替代标准。
563赞 Artur Czajka 6/11/2012 #12

注释是设计从JSON中删除的。

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

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

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

评论

301赞 intrepidis 10/14/2012
我以为JSON应该比XML更易于人类阅读?注释是为了提高可读性。
46赞 intrepidis 10/14/2012
无论如何,您可能会调皮并在 JSON 中添加解析指令:{“__directives”:{“#n#”:“DateTime.Now”}, “validdate”:“#n#”}...看起来 YAML 是前进的方向......
115赞 caiosm1005 9/23/2013
个人意见:不允许评论是蹩脚的。我别无选择,只能构建一个忽略注释的非标准 JSON 解析器来解码我的配置文件。
65赞 adelphus 6/12/2014
“我从 JSON 中删除了注释,因为我看到人们正在使用它们来保存解析指令”。按照这个逻辑,他也应该删除字符串类型。可怕的决定。
127赞 Phil Goetz 5/15/2015
这就像要求所有自行车都有训练轮,因为有些人不会骑自行车。因为愚蠢的人滥用它而删除一个重要的功能是糟糕的设计。数据格式应该优先考虑可用性,而不是防白痴。
37赞 AZ. 8/4/2012 #13

这取决于您的 JSON 库。Json.NET 支持 JavaScript 样式的注释、./* commment */

请参阅另一个 Stack Overflow 问题

评论

0赞 webXL 9/18/2014
我相信这就是为什么我在这个 ASP.NET vNext 预览页面(在 package.json 下)的屏幕截图中看到一条评论:blogs.msdn.com/b/webdev/archive/2014/06/03/...... 虽然我还没有在规范中找到任何东西。
37赞 Basel Shishani 12/11/2012 #14

JSON 对于配置文件和其他本地用法很有意义,因为它无处不在,而且比 XML 简单得多。

如果人们在交流数据时有充分的理由反对在JSON中使用注释(无论是否有效),那么JSON可以分为两部分:

  • JSON-COM:JSON 在线,或通信 JSON 数据时应用的规则。
  • JSON-DOC:JSON 文档,或文件中或本地的 JSON。定义有效 JSON 文档的规则。

JSON-DOC 将允许注释,并且可能存在其他细微的差异,例如处理空格。解析器可以轻松地从一个规范转换为另一个规范。

关于道格拉斯·克罗克福德(Douglas Crockford)就此问题发表的评论(由@Artur Czajka引用)

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

我们正在谈论一个通用的配置文件问题(跨语言/平台),他正在用一个特定于 JS 的实用程序来回答!

当然,特定于 JSON 的缩小可以在任何语言中实现, 但是要对此进行标准化,使其在所有语言和平台的解析器中无处不在,这样人们就不会浪费时间缺少该功能,因为他们有很好的用例,在在线论坛中查找问题,并让人们告诉他们这是一个坏主意,或者建议很容易实现从文本文件中剥离注释。

另一个问题是互操作性。假设您有一个库或 API 或任何类型的子系统,其中包含一些与之关联的配置或数据文件。这个子系统是 可以从不同的语言访问。然后你去告诉人们:顺便说一句 在将注释传递给解析器之前,不要忘记从 JSON 文件中删除注释!

评论

0赞 8/8/2014
无需对 JSON 进行分段。带有注释的 JSON 不再是 JSON。但是,用注释注释来注释你的 JSON 是完全可以接受的,只要你确保在解析或传输它之前将它们剥离掉。这样做永远不应该是接收者的责任。
44赞 gaborous 6/25/2013 #15

其他答案指出 JSON 不支持注释,但这部分是不正确的:规范作者 Douglas Crokford 澄清说,JSON 解码器可以接受注释,只要它们被丢弃。

因此,制作自己的 JSON 解码器或至少是接受注释的预处理器,然后将它们剥离(只要您忽略注释并且不使用它们来指导应用程序应如何处理 JSON 数据),这是完全可以的,并且是一个公认的用例)。例如,这适用于存储在 JSON 中的配置文件,如下面的注释@toolbear所示。显然,由于 JSON 主要是一种数据传输格式,因此尽可能稀疏,因此如果您传输带有注释的 JSON 文件,最好先去除注释以节省网络带宽。

源:

JSON 没有注释。JSON 编码器不得输出注释。 JSON 解码器可以接受和忽略注释。

评论绝不应用于传递任何有意义的内容。那是 JSON 的用途。

2005 年,JSON 规范的作者 Douglas Crockford 在论坛帖子中发帖。

评论

5赞 8/8/2014
Crockford后来继续写道:“假设你使用JSON来保存配置文件,你想对这些文件进行注释。继续并插入您喜欢的所有评论。然后通过 JSMin 将其传递给 JSON 解析器。有关更多信息,请参阅 @kyle-simpson 关于 JSON.minify 的回答。
243赞 p3drosola 8/2/2013 #16

免责声明:您的保修无效

如前所述,此黑客利用了规范的实现。并非所有 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]
}

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

祝您黑客愉快!

评论

181赞 Quentin 8/2/2013
规范来看:对象中的名称应该是唯一的。
108赞 sep332 8/2/2013
不能保证 JSON 中元素的顺序。这意味着“最后一个”项目可能会改变!
73赞 voidlogic 8/2/2013
这显然违反了规范(见上面的评论),不要这样做。ietf.org/rfc/rfc4627.txt?number=4627
379赞 deanWombourne 8/2/2013
- 如果解析器正在流式处理怎么办?如果解析器将其读入未定义键顺序的字典中,该怎么办?用火杀死它
35赞 Joe Hildebrand 8/4/2013
由于我们一直在 IETF 的 JSON 工作组中研究 RFC 4627bis(加入我们并提供帮助!datatracker.ietf.org/wg/json),我们发现实现者对对象中的重复名称使用了四种不同的方法:使用第一种;使用最后一个;报告所有这些,让来电者选择一个;返回错误并停止解析。如果数据无法在所有这些方法中幸存下来,那么它在实践中就无法互操作。
27赞 Sergey Orshanskiy 10/8/2013 #17

您可以在 JSONP 中添加注释,但不能在纯 JSON 中使用注释。我刚刚花了一个小时试图让我的程序与 Highcharts 中的这个示例一起工作。

如果您点击链接,您将看到

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

由于我的本地文件夹中有一个类似的文件,因此同源策略没有问题,所以我决定使用纯 JSON...当然,由于这些评论,它默默地失败了。$.getJSON

最终,我只是向上面的地址发送了一个手动 HTTP 请求,并意识到内容类型是因为 JSONP 返回纯 JavaScript。在这种情况下,允许评论。但是我的应用程序返回了 content-type ,所以我不得不删除注释。text/javascriptapplication/json

14赞 Chris 10/29/2013 #18

为了将 JSON 项目切成多个部分,我添加了“虚拟注释”行:

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

评论

16赞 Artur Czajka 11/19/2013
您已在 JSON 中模拟了 INI 文件结构。请放下你的金锤。
4赞 William Entriken 6/10/2014
RFC 说“对象中的名称应该是唯一的”。另请参阅此人在解析 JSON 时遇到错误,如上所述:stackoverflow.com/questions/4912386/...
0赞 gregsdennis 6/26/2015
如果使用架构来验证 JSON,则可能会因额外的字段而失败。
1赞 Jazimov 9/5/2015
如果你真的下定决心要给 JSON 添加注释,那么做这样的事情会更有意义:这样可以使名称保持唯一,并允许你添加任何你喜欢的字符串值。这仍然是一个问题,因为注释不应该是你的JSON的一部分。作为另一种选择,为什么不在 JSON 之前或之后添加注释,而不是在 JSON 中添加注释呢?{ "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." }
9赞 Steve Thomas 11/28/2013 #19

叹息。为什么不直接添加字段,例如

{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}

只要确保您的“notex”名称不与任何实际字段冲突即可。

评论

10赞 William Entriken 5/14/2014
Just make sure your "notex" names don't conflict with any real fields.是问题所在。这不是一个武断的解决方案。
4赞 Craig Tullis 9/15/2014
这也带来了一个问题,即在传输之前,注释不能被缩小实用程序剥离,这不可避免地导致传输的大量数据在传输的另一端毫无用处。我真的觉得从 JSON 规范中删除注释支持是不幸的。具体来说,因为人们将一起破解解决方案。将支持从规范中移除是一种行为控制的尝试,由于相互不兼容的变通方法的激增,这种行为控制只会失败,并产生更大的不兼容性。
2赞 olivr 4/8/2015
在配置文件中,我使用 .这是有效的 JSON,因为 JSON 接受键字符串中的任何字符。它不会与其他属性发生冲突,也没有人在乎或重新排序。不过,2 条评论一定不相同。{"/* ---- my section ----*/":0}
3赞 gregsdennis 6/26/2015
如果使用架构来验证 JSON,则可能会因额外的字段而失败。
1赞 slim 10/20/2016
一些对象解组器(例如,在某些配置下,Jackson)会在未知字段上抛出异常。
12赞 Joshua Richardson 12/7/2013 #20

JSON的作者希望我们在JSON中包含注释,但在解析它们之前将它们剥离(参见Michael Burr提供的链接)。如果JSON应该有注释,为什么不对它们进行标准化,让JSON解析器来完成这项工作呢?我不同意那里的逻辑,但是,唉,这就是标准。按照其他人的建议使用 YAML 解决方案是很好的,但它需要库依赖项。

如果你想去掉注释,但又不想有库依赖,这里有一个两行解决方案,它适用于 C++ 风格的注释,但可以适应其他注释:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

请注意,此解决方案只能在可以确定 JSON 数据不包含注释发起方的情况下使用,例如 ('//')。

实现 JSON 解析、去除注释且无需额外库的另一种方法是在 JavaScript 解释器中评估 JSON。当然,这种方法需要注意的是,您只想评估未受污染的数据(没有不受信任的用户输入)。下面是 Node.js 中这种方法的示例——另一个警告,以下示例只会读取一次数据,然后它将被缓存:

data = require(fs.realpathSync(doctree_fp));

评论

11赞 Kyle Simpson 12/9/2013
这是行不通的,因为它没有考虑 /* 是否可以转义,或者是否可以在字符串文本中。JSON 不是正则语法,因此正则表达式是不够的。您必须解析它以找出评论的位置。
0赞 Joshua Richardson 12/12/2013
它将在有限的情况下工作,您可以确保 JSON 不包含任何包含注释字符串的数据。感谢您指出该限制。我已经编辑了这篇文章。
0赞 Alexis Wilke 6/26/2014
+1 链接!实际上,我认为不支持注释是一件好事,因为在客户端和服务器之间发送数据时,注释绝对是无用的,并且会白白地占用大量带宽。这就像有人要求在 MP3 结构或 JPEG 数据块中发表评论......
1赞 Craig Tullis 9/15/2014
@AlexisWilke,“注释绝对是无用的,并且白白地占用了大量带宽”——这就是为什么规范中应该支持注释的原因。只要看看建议的解决方法的数量,这些解决方法涉及许多不同但相似的方式,将注释作为数据放入 JSON 中,保证缩小工具无法删除注释,保证它们通过网络传输,并迫使远程解析器以不同程度的成功处理它们。你试图在意识形态上强迫人们,他们会想办法绕过你。就这样......
1赞 Craig Tullis 9/17/2014
@AlexisWilke,在某些时候,这一切似乎不是有点像为了能够在JSON文件中添加注释而竭尽全力吗?就我而言,我只需要一些代码(不是整个 C/C++ 编译器,在额外的运行时库中运行,如果在 Cygwin/Ming 下运行,则更是如此),在我可以通过 JSON 解析器传递配置文件之前去除注释。我还检测配置文件何时更改并动态重新加载它们等。我不能简单地在文件中添加评论而不担心它,这是多么蹩脚?太蹩脚了。那是多少。;-)
8赞 Aurimas 1/28/2014 #21

有一个很好的解决方案(hack),它是有效的 JSON,但它并非在所有情况下都有效(请参阅下面的评论)。 只需将同一密钥制作两次(或更多次)。例如:

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

因此,JSON 会将其理解为:

{
  "param" : "This is value place",
}

评论

12赞 2/13/2014
如果有人遍历对象,此方法可能会造成一些麻烦。在第一次迭代中,程序将没有条目是注释的信息。
9赞 William Entriken 6/10/2014
RFC 说:“对象中的名称应该是唯一的”。请参阅以下位置报告的此错误:stackoverflow.com/questions/4912386/...
9赞 8/8/2014
这样做是创建 JSON 的邀请,该 JSON 会在将来的某个随机时间点爆炸。
7赞 Mark Lakata 5/27/2015
不能保证顺序在对象名称/值对列表中很重要。解析器可以“乱序”地解析它们,然后这被破坏了。
3赞 gnasher729 10/7/2017
具有此类代码的 JSON 解析器的行为是未定义的。没有什么可说的,解析器的行为就好像只存在最后一个值一样。它可以表现得好像只有第一个值存在,或者任何值,或者好像值是一个数组。
86赞 Andrejs 2/7/2014 #22

如果您使用 Jackson 作为 JSON 解析器,那么这就是您启用它以允许评论的方式:

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

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

{
  key: "value" // Comment
}

您还可以通过设置以下设置来发表评论:#

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

但总的来说(如前所述),规范不允许注释。

评论

0赞 R. Du 11/20/2020
这是可逆的吗?如果加载文件并将其写回怎么办?
378赞 laktak 3/20/2014 #23

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

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

Hjson intro

请参阅 JavaScript、Java、Python、PHP、Rust、Go、Ruby、C++ 和 C# 库的 hjson.github.io。

评论

34赞 konsolebox 7/1/2014
点赞。这显然是一个很好的变化,不开放的保守派人士只会喜欢讨厌。我希望您的实现能得到进一步的了解 - 甚至可能比原始;)更受欢迎我希望有人也能用 Ruby 实现它。@adelphus 定义明确的语言是你自己的观点或意见。如果你是一个保守的“开发人员”,并不能证明你更好,而且你可能会更糟,把自己锁在有限的空间里。不要轻易地把人评判为糟糕的开发人员。
20赞 adelphus 7/10/2014
对不起,@konsolebox。也许你可能会在阅读后重新考虑你的“定义良好的JSON是你的意见”的观点 ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 这是一个真正的标准,开发人员实现自己的“特殊”版本会导致碎片化、混乱和大量时间浪费。看看 Web 开发人员在编写代码时留下的混乱,因为每个浏览器实现的标准版本略有不同。JSON 语言可能并不完美,但碎片化更糟。是的,这只是一种意见,你可以自由地不同意。
34赞 8/8/2014
我很佩服你的进取心,但你有点重新发明 YAML。如果你想要很大的灵活性和人类的可读性,请使用 YAML(实际上不要:stackoverflow.com/questions/450399/...)或坚持使用古怪但明确的 JSON。
9赞 Matt 2/10/2015
我发现最人性化的配置格式仍然是 INI。它很简单,语法不是很重。这使得用户只需将脚趾浸入配置池中就不那么令人生畏了。
29赞 jebbie 4/6/2016
每当您需要 json 作为配置(需要注释的地方)时 - 将文件命名为“.js”而不是“.json”。JS当然可以处理任何有效的JSON对象,还可以处理注释。这就是为什么它是“webpack.config.js”而不是“webpack.config.json”的原因(好吧,在 webpack :P 中也有很多原因)
26赞 William Entriken 4/25/2014 #24

这是一个“你能”的问题。这是一个“是”的答案。

不可以,不应使用重复的对象成员将侧信道数据填充到 JSON 编码中。(请参阅 RFC 中的“对象中的名称应该是唯一的”)。

是的,你可以在 JSON 周围插入注释,你可以解析掉这些注释。

但是,如果您想要一种将任意侧信道数据插入和提取到有效 JSON 的方法,这里有一个答案。我们利用 JSON 编码中数据的非唯一表示形式。在RFC的第二节中,在“六个结构字符中的任何一个之前或之后允许空格”下,这是允许的*

*RFC 仅声明“在六个结构字符中的任何一个之前或之后都允许使用空格”,没有明确提及字符串、数字、“false”、“true”和“null”。在所有实现中都会忽略此遗漏。


首先,通过缩小 JSON 来规范化它:

$jsonMin = json_encode(json_decode($json));

然后以二进制形式对注释进行编码:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

然后隐藏你的二进制文件:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

这是您的输出:

$jsonWithComment = $steg . $jsonMin;

评论

2赞 William Entriken 9/25/2014
RFC 仅声明“在六个结构字符中的任何一个之前或之后允许使用空格”,没有明确提及字符串、数字、“false”、“true”、“null”。在所有实现中都会忽略此遗漏。
1赞 Claire Nielsen 9/27/2018
为了提高注释密度,您不能将注释编码为三元,并使用空格、制表符和换行符对其进行处理吗?
0赞 Jeff K 9/24/2019
“应该”不是“必须”。请参阅明确包含的 RFC 2119: MUST:此词或术语“REQUIRED”或“SHALL”表示该定义是规范的绝对要求。...应该:这个词,或形容词“推荐”,意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前,必须理解并仔细权衡全部含义。
2赞 William Entriken 9/27/2019
很好的参考。反对使用重复密钥的更好理由是标准的引用“当对象中的名称不唯一时,接收此类对象的软件的行为是不可预测的。现在我也明白了为什么标准不是“必须是唯一的”,这使得验证器更简单,它只需要跟踪 [ 和 {,它不需要知道哪些密钥已经使用。
9赞 Даниил Пронин 7/3/2014 #25

我刚刚找到了“grunt-strip-json-comments”。

“从 JSON 中剥离注释。它允许您在 JSON 文件中使用注释!

{
    // Rainbows
    "unicorn": /* ❤ */ "cake"
}

评论

0赞 8/8/2014
不妨在使用它时缩小该 JSON。请参阅 @kyle-simpson 关于 JSON.minify 的答案。
-5赞 Maurício Giordano 7/8/2014 #26

是的,你可以,但你的解析可能会失败(没有标准)。

要解析它,您应该删除这些注释,或者手动删除,或者使用正则表达式:

它替换任何注释,例如:

/****
 * Hey
 */

/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/

它替换任何注释,例如:

// Hey

/\/\/.*/

在 JavaScript 中,你可以做这样的事情:

jsonString = jsonString.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/, "").replace(/\/\/.*/,"")
var object = JSON.parse(jsonString);

评论

7赞 6502 8/3/2014
你的正则表达式会从字符串内部删除诸如 even 之类的内容。/*hey*/
0赞 Maurício Giordano 8/6/2014
好渔获!因此,只需更改正则表达式上的一些东西即可。
1赞 8/8/2014
众所周知,结构化语言的正则表达式很难正确处理。查看 @kyle-simpson 关于 JSON.minify 作为临时正则表达式的替代方案的回答。
3赞 user229044 9/5/2018
关于“(没有标准)”,肯定有一个标准可以准确定义JSON是什么,而且早在写这个答案之前就已经有了。
0赞 Maurício Giordano 6/2/2020
@meagar 我从未回复过你的评论。我的意思是标准参考评论,如果您能在这里找到与此相关的任何内容,请告诉我 json.org/json-en.html
7赞 Nick 7/19/2014 #27

如果您的上下文是 Node.js 配置,您可以考虑将 JavaScript via 作为 JSON 的替代方案:module.exports

module.exports = {
    "key": "value",

    // And with comments!
    "key2": "value2"
};

语法仍将相同。作为 JavaScript,文件扩展名应为 .require.js

评论

0赞 rob 6/1/2017
我真的认为这个问题的第二页答案没有意义,但这正是我正在寻找的,并且完美无缺!谢谢。
58赞 dvdmn 7/25/2014 #28

如果将 Newtonsoft.Json 库与 ASP.NET 一起使用来读取/反序列化,则可以在 JSON 内容中使用注释:

“名称”: “字符串”

“id”:整数

/* 这是一个

评论示例 */

附言:只有 6+ 版本的 Newtonsoft Json 支持单行注释。

对于无法跳出框框思考的人的附加说明:我在我制作的 ASP.NET Web 应用程序中使用 JSON 格式进行基本设置。我读取了文件,将其转换为带有 Newtonsoft 库的设置对象,并在必要时使用它。

我更喜欢在 JSON 文件本身中写下关于每个单独设置的注释,我真的不关心 JSON 格式的完整性,只要我使用的库可以接受它。

我认为这是一种“更易于使用/理解”的方式,而不是创建单独的“设置”。README“文件并解释其中的设置。

如果您对这种使用有疑问;对不起,精灵不在灯里了。人们会发现 JSON 格式的其他用法,而您对此无能为力。

评论

1赞 gman 6/6/2019
关键是带有注释的文件不是 JSON,并且无法被许多 JSON 库解析。您可以在自己的程序中随意做任何您想做的事情,但带有注释的文件不是 JSON。如果你声称它是,那么人们会尝试用他们选择的语言/库来解析它,但它会失败。这就像询问是否可以在 XML 中使用方括号而不是尖括号。您可以做任何您想做的事,但它将不再是 XML。
0赞 Jens Mander 1/16/2022
如果解析器实现发生更改,可能会出现问题。
17赞 Joy 11/27/2014 #29

我们正在为我们的项目使用 strip-json-comments。它支持如下内容:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

只需像以下方式一样安装和使用它:npm install --save strip-json-comments

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

评论

2赞 Roy Prins 7/31/2019
请注意,当它包含这些专有注释时,它不再是有效的 JSON。json
0赞 Peter Mortensen 10/9/2020
strip-json-comments 在什么上下文中运行?节点.js?
0赞 Joy 10/9/2020
@PeterMortensen我尝试了 node.js。您可以尝试是否适用于客户端 JS。
1赞 spuder 7/3/2015 #30

还有其他与 JSON 兼容的库,它们支持注释。

一个值得注意的例子是“Hashcorp 语言”(HCL)”。它是由制作流浪者、包装工、领事和保险库的同一个人编写的。

26赞 Manish Shrivastava 7/20/2015 #31

JSON 不是框架协议。它是一种无语言的格式。因此,没有为 JSON 定义注释的格式。

正如许多人所建议的那样,有一些技巧,例如,您可以使用重复的密钥或特定密钥。这取决于你。_comment

6赞 Mark 11/7/2015 #32

正如许多答案已经指出的那样,JSON本身没有注释。当然,有时你还是想要它们。对于 Python,有两种方法可以做到这一点,即使用 commentjson(仅适用于 Python 2)或 json_tricks(或用于 Python 2 和 Python 3),它还有其他几个功能。免责声明:我做了.#//#//json_tricks

35赞 Smit Johnth 11/24/2015 #33

如果使用 JSON5,则可以包含注释。


JSON5 是 JSON 的拟议扩展,旨在使人类更容易手动编写和维护。它通过直接从 ECMAScript 5 添加一些最小的语法功能来实现这一点。

89赞 Dominic Cerisano 11/28/2015 #34

。JSON曾经支持注释,但它们被滥用并从标准中删除。

来自 JSON 的创建者:

我从 JSON 中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性。我知道缺乏评论会让一些人感到难过,但不应该。- 道格拉斯·克罗克福德,2012

官方 JSON 站点位于 JSON.org。JSON被ECMA国际定义为标准。总有一个请愿程序来修改标准。由于多种原因,不太可能将注释添加到 JSON 标准中。

JSON的设计是XML的一种易于逆向工程(人工解析)的替代方案。它被简化到不需要注释的地步。它甚至不是一种标记语言。目标是稳定性和互操作性。

任何了解面向对象的“has-a”关系的人都可以理解任何JSON结构 - 这就是重点。它只是一个带有节点标签(键/值对)的有向无环图 (DAG),这是一种近乎通用的数据结构。

唯一需要的注解可能是“//这些是 DAG 标签”。键名称可以根据需要提供信息,允许任意语义。

任何平台都可以通过几行代码解析 JSON。XML 需要复杂的 OO 库,这些库在许多平台上都不可行。

注解只会降低 JSON 的互操作性。除非您真正需要的是标记语言 (XML),并且不在乎您的持久化数据是否易于解析,否则无需添加任何其他内容。

但是,正如 JSON 的创建者所观察到的那样,JS 管道一直支持注释:

继续并插入您喜欢的所有评论。 然后通过 JSMin 管道传输它,然后再将其传递给 JSON 解析器。- 道格拉斯·克罗克福德,2012

12赞 vitaly-t 12/29/2015 #35

如果将 JSON 加载为文本文件,则可以使用带有注释的 JSON,然后删除注释。

例如,您可以使用 decomment 库。下面是一个完整的示例。

输入 JSON(文件 input.js):

/*
* multi-line comments
**/
{
    "value": 123 // one-line comment
}

测试应用:

var decomment = require('decomment');
var fs = require('fs');

fs.readFile('input.js', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        var text = decomment(data); // removing comments
        var json = JSON.parse(text); // parsing JSON
        console.log(json);
    }
});

输出:

{ value: 123 }

参见:gulp-decomment、grunt-decomment

评论

14赞 user229044 9/5/2018
如果以需要特殊预处理器处理的自定义方式扩展语言,则不再是 JSON
0赞 vitaly-t 9/5/2018
@meagar 有 JSON5 规范,它支持注释等。但最终它从未成为标准。
2赞 MovGP0 2/12/2016 #36

您可以使用 JSON-LD 和 schema.org 注释类型来正确编写注释

{
    "https://schema.org/comment": "this is a comment"
}
3赞 Melvin M. 3/25/2016 #37

如果你使用的是 PHP,你可以使用这个函数在将 JSON 字符串解析为对象/数组之前,从 JSON 字符串中搜索和删除 // /* 类型注释:

function json_clean_decode($json, $assoc = true, $depth = 512, $options = 0) {
       // search and remove comments like /* */ and //
       $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

       if(version_compare(phpversion(), '5.4.0', '>=')) {
           $json = json_decode($json, $assoc, $depth, $options);
       }
       elseif(version_compare(phpversion(), '5.3.0', '>=')) {
           $json = json_decode($json, $assoc, $depth);
       }
       else {
           $json = json_decode($json, $assoc);
       }

       return $json;
   }

希望这有帮助!

评论

0赞 dreftymac 12/4/2016
解决方案类别 == '通过 Preproc 进行转换'
23赞 WilliamK 8/27/2016 #38

就我而言,我需要在 JSON 输出之前使用注释进行调试。所以我把调试信息放在HTTP头中,以避免破坏客户端:

header("My-Json-Comment: Yes, I know it's a workaround ;-) ");

Enter image description here

4赞 xdeepakv 12/8/2016 #39

是的,您可以发表评论。但我不会推荐上面提到的任何原因。

我做了一些调查,我发现所有JSON要求方法都使用该方法。因此,我想出了一个解决方案:我们可以覆盖或围绕 JSON.parse 进行猴子修补。JSON.parse

注意:仅在 Node.js 上测试;-)

var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
    json = json.replace(/\/\*.+\*\//, function(comment){
        console.log("comment:", comment);
        return "";
    });
    return oldParse(json)
}

JSON 文件:

{
  "test": 1
  /* Hello, babe */
}

评论

2赞 DSimon 12/22/2016
{ what_if: "I happen to have /* slashes and asterisks */ in my data?" }
3赞 DSimon 12/22/2016
我的意思是,大多数语言你不必担心字符串中的注释序列。即使在支持注释的 JSON 实现中,我也希望解析我的示例会生成一个具有键和值 的对象,而不是 ."what_if""I happen to have /* slashes and asterisks */ in my data?""I happen to have in my data"
0赞 xdeepakv 12/22/2016
使用正则表达式可以避免数据转换到。据我了解,情况并非如此。JSON被用作数据,而不是语言。因此,请避免垃圾数据或数据中的注释。:-D大多数语言,您编写的代码以其他格式编译。在 JS 中,它是动态绑定的。没有这种类型的编译发生。V8 做了一些优化,但这也是在推送和失败方法中。
0赞 Maxim Paperno 5/8/2018
@DSimon我同意......这似乎适用于许多情况:regexr.com/3p39pjson.replace(/("\/\/.*"|"\/\*(?:.|\n)*?")|(\/\/.*|\/\*(?:.|\n)*?\*\/)/g, "$1")
5赞 Alexander Shostak 4/17/2017 #40

您可以通过正则表达式使用简单的预处理。例如,以下函数将在 PHP 中解码注释的 JSON:

function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts = 0) {
  $data = preg_replace('~
    (" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
  ~xs', '$1', $data);

  return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}

它支持所有 PHP 样式的注释:/*、#、//。字符串文本按原样保留。

102赞 mana 6/22/2017 #41

以下是我在 Google Firebase 文档中找到的内容,它允许您在 JSON 中添加注释:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}

评论

0赞 gutte 11/2/2017
仅供参考,Firebase 实时数据库不允许在键中使用“/”。因此,这可能是您自己使用的一个很好的约定,但您不能在 Firebase 中这样做
10赞 MovGP0 1/19/2018
此方法会破坏某些库,这些库要求密钥必须是唯一的。我正在通过对评论进行编号来解决这个问题。
0赞 mana 1/21/2018
好评论,我在 SO 上找到了这个问题......这部分似乎不在规范 stackoverflow.com/questions/21832701/ 涵盖范围内......
16赞 MovGP0 3/10/2018
我现在倾向于这样使用它: { “//foo”: “foo comment”, “foo”: “foo value”, “//bar”: “bar comment”, “bar”: “bar value” } 您可以将一个数组用于多个注释: { “//foo”: [ “foo comment 1”, “foo comment 2” ], “foo”: ''foo value“ }
27赞 fyngyrz 6/19/2018 #42

JSON本身不允许注释。这种推理是完全愚蠢的,因为您可以使用 JSON 本身来创建注释,这完全消除了推理,并且毫无理由地加载解析器数据空间,以获得完全相同的结果和潜在问题,例如:带有注释的 JSON 文件。

如果你尝试在里面放注释(例如,使用 // 或 /* */#),那么一些解析器会失败,因为严格来说,这不是 在 JSON 规范中。所以你永远不应该那样做。

例如,在这里,我的图像处理系统保存了图像符号和与之相关的一些基本格式化(注释)信息(在底部):

{
    "Notations": [
        {
            "anchorX": 333,
            "anchorY": 265,
            "areaMode": "Ellipse",
            "extentX": 356,
            "extentY": 294,
            "opacity": 0.5,
            "text": "Elliptical area on top",
            "textX": 333,
            "textY": 265,
            "title": "Notation 1"
        },
        {
            "anchorX": 87,
            "anchorY": 385,
            "areaMode": "Rectangle",
            "extentX": 109,
            "extentY": 412,
            "opacity": 0.5,
            "text": "Rect area\non bottom",
            "textX": 98,
            "textY": 385,
            "title": "Notation 2"
        },
        {
            "anchorX": 69,
            "anchorY": 104,
            "areaMode": "Polygon",
            "extentX": 102,
            "extentY": 136,
            "opacity": 0.5,
            "pointList": [
                {
                    "i": 0,
                    "x": 83,
                    "y": 104
                },
                {
                    "i": 1,
                    "x": 69,
                    "y": 136
                },
                {
                    "i": 2,
                    "x": 102,
                    "y": 132
                },
                {
                    "i": 3,
                    "x": 83,
                    "y": 104
                }
            ],
            "text": "Simple polygon",
            "textX": 85,
            "textY": 104,
            "title": "Notation 3"
        }
    ],
    "imageXW": 512,
    "imageYW": 512,
    "imageName": "lena_std.ato",
    "tinyDocs": {
        "c01": "JSON image notation data:",
        "c02": "-------------------------",
        "c03": "",
        "c04": "This data contains image notations and related area",
        "c05": "selection information that provides a means for an",
        "c06": "image gallery to display notations with elliptical,",
        "c07": "rectangular, polygonal or freehand area indications",
        "c08": "over an image displayed to a gallery visitor.",
        "c09": "",
        "c10": "X and Y positions are all in image space. The image",
        "c11": "resolution is given as imageXW and imageYW, which",
        "c12": "you use to scale the notation areas to their proper",
        "c13": "locations and sizes for your display of the image,",
        "c14": "regardless of scale.",
        "c15": "",
        "c16": "For Ellipses, anchor is the  center of the ellipse,",
        "c17": "and the extents are the X and Y radii respectively.",
        "c18": "",
        "c19": "For Rectangles, the anchor is the top left and the",
        "c20": "extents are the bottom right.",
        "c21": "",
        "c22": "For Freehand and Polygon area modes, the pointList",
        "c23": "contains a series of numbered XY points. If the area",
        "c24": "is closed, the last point will be the same as the",
        "c25": "first, so all you have to be concerned with is drawing",
        "c26": "lines between the points in the list. Anchor and extent",
        "c27": "are set to the top left and bottom right of the indicated",
        "c28": "region, and can be used as a simplistic rectangular",
        "c29": "detect for the mouse hover position over these types",
        "c30": "of areas.",
        "c31": "",
        "c32": "The textx and texty positions provide basic positioning",
        "c33": "information to help you locate the text information",
        "c34": "in a reasonable location associated with the area",
        "c35": "indication.",
        "c36": "",
        "c37": "Opacity is a value between 0 and 1, where .5 represents",
        "c38": "a 50% opaque backdrop and 1.0 represents a fully opaque",
        "c39": "backdrop. Recommendation is that regions be drawn",
        "c40": "only if the user hovers the pointer over the image,",
        "c41": "and that the text associated with the regions be drawn",
        "c42": "only if the user hovers the pointer over the indicated",
        "c43": "region."
    }
}

评论

0赞 Dominic Cerisano 7/15/2019
推理并不愚蠢,你刚刚证明了这一点。将注释实现为标记可保持互操作性这正是 Crockford 希望将评论解析为标签的原因。现在一切都只是一个标签,并以相同的方式解析。
1赞 fyngyrz 1/28/2020
如果规范规定“以 # 开头的行是注释”,那么这将是完全可互操作的。就目前而言,注释都加载了解析器空间,因为它们是有效的解析项,而不是被理解为注释,并且对于存在的每个.json文件,它们可能不同。然而,如果(例如)规范说“以 # 开头的行是注释”,那么解析器可以跳过这些行而不解析(更快),并且不加载解析器空间(更好的内存利用率)。.json中缺乏评论根本没有好处,只有缺点。
4赞 bortunac 7/8/2018 #43

*.json 文件通常用作配置文件或静态数据,因此需要注释→某些编辑器(如 NetBeans)接受 *.json 中的注释。

问题在于将内容解析为对象。解决方案是始终应用清理功能(服务器或客户端)。

###PHP

 $rgx_arr = ["/\/\/[^\n]*/sim", "/\/\*.*?\*\//sim", "/[\n\r\t]/sim"];
 $valid_json_str = \preg_replace($rgx_arr, '', file_get_contents(path . 'a_file.json'));

###JavaScript

valid_json_str = json_str.replace(/\/\/[^\n]*/gim,'').replace(/\/\*.*?\*\//gim,'')

评论

0赞 Peter Mortensen 10/9/2020
什么是“jcomment”
8赞 Tom 1/23/2019 #44

2019 年 Visual Studio Code 用户的实际答案是使用“jsonc”扩展。

这是实用的,因为这是 Visual Studio Code 识别的扩展,用于指示“带注释的 JSON”。请在下面的评论中让我知道其他编辑器/IDE。

如果 Visual Studio Code 和其他编辑器也添加对 JSON5 的本机支持,那就太好了,但目前 Visual Studio Code 仅包含对“jsonc”的支持。

(在发布此内容之前,我搜索了所有答案,但没有提到“jsonc”。

评论

0赞 GhostCat 10/25/2019
jsonc很好,但不幸的是,你只能 // 评论。当你需要别的东西时,你也有点崩溃。stackoverflow.com/questions/58553633/......
4赞 jlettvin 3/19/2019 #45

当然,您可以注释 JSON。要从 JavaScript 中读取带注释的 JSON 文件,您可以在解析之前去除注释(请参阅下面的代码)。我相信这段代码可以改进,但对于那些使用正则表达式的人来说很容易理解。

我使用带注释的 JSON 文件为我的合成反射系统指定神经元形状。我还使用带注释的 JSON 来存储正在运行的神经元系统的中间状态。发表评论非常方便。不要听那些告诉你他们是个坏主意的说教者。

fetch(filename).then(function(response) {
    return response.text();
}).then(function(commented) {
    return commented.
        replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1').
        replace(/\r/,"\n").
        replace(/\n[\n]+/,"\n");
}).then(function(clean) {
    return JSON.parse(clean);
}).then(function(json) {
    // Do what you want with the JSON object.
});
1赞 Malekai 4/6/2019 #46

我在当前的项目中遇到了这个问题,因为我有相当多的 JSON 需要一些注释才能使事情易于记住。

我使用这个简单的 Python 函数来替换注释并用于将其转换为:json.loadsdict

import json, re

def parse_json(data_string):
  result = []
  for line in data_string.split("\n"):
    line = line.strip()
    if len(line) < 1 or line[0:2] == "//":
      continue
    if line[-1] not in "\,\"\'":
      line = re.sub("\/\/.*?$", "", line)
    result.append(line)
  return json.loads("\n".join(result))

print(parse_json("""
{
  // This is a comment
  "name": "value" // so is this
  // "name": "value"
  // the above line gets removed
}
"""))
27赞 Roy Prins 6/17/2019 #47

免责声明:这很傻

实际上有一种方法可以添加注释,并保持在规范范围内(不需要额外的解析器)。不过,如果不进行任何形式的解析,它不会产生人类可读的评论。

您可以滥用以下内容:

在任何标记之前或之后都允许使用无关紧要的空格。 空格是以下一个或多个代码的任意序列 点数:字符制表 (U+0009)、换行符 (U+000A)、回车 return (U+000D) 和空格 (U+0020)。

以一种诡计多端的方式,你可以滥用它来添加评论。例如:用制表符开始和结束您的评论。在 base3 中对注释进行编码,并使用其他空格字符来表示它们。例如。

010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202

(hello base three在 ASCII 中),但不是 0 使用空格,而是 1 使用换行符,2 使用回车符。

这只会给您留下很多不可读的空白(除非您制作一个 IDE 插件来动态编码/解码它)。

出于显而易见的原因,我什至从未尝试过,你也不应该这样做。

10赞 ifelse.codes 11/6/2019 #48

JSON 规范不支持注释、样式。// or /* */

但是一些 JSON 解析库和 IDE 支持它们。

喜欢:

  1. JSON5的
  2. Visual Studio 代码
  3. 评论json

评论

0赞 Quang Van 1/13/2020
VS 代码 FTW 🙌.jsonc
1赞 Peter Mortensen 10/9/2020
JSON5 不是 JSON 的第五个版本。
1赞 nevelis 6/12/2020 #49

是的。您可以将注释放在 JSON 文件中。

{
    "": "Location to post to",
    "postUrl": "https://example.com/upload/",

    "": "Username for basic auth",
    "username": "joebloggs",

    "": "Password for basic auth (note this is in clear, be sure to use HTTPS!",
    "password": "bloejoggs"
}

注释只是一段描述代码块或配置用途的文本。而且,由于您可以在 JSON 中多次指定键,因此可以像这样执行此操作。它在语法上是正确的,唯一的权衡是你的字典中会有一个空键,里面有一些垃圾值(你可以修剪......

我多年前就看到了这个问题,但我只是在我正在做的一个项目中看到过这样的工作,我认为这是一种非常干净的方式。享受!

评论

2赞 Rounin 6/16/2020
注意:“对象中的名称应该是唯一的。 (来源:IETF JSON 规范,2017 年 12 月
1赞 nevelis 6/16/2020
在规范中,SHOULD 的含义与 MUST 不同。其他带有注释的答案将破坏所有 JSON 解析器。我很想知道重复的键是否在任何地方有任何不良副作用。
0赞 Rounin 6/16/2020
我的观点(仅仅)不是说对象中的名称必须是唯一的,只是它们应该是唯一的。在搜索了 Stack Overflow(以及更广泛的网络)一天多之后,我尽了最大努力想出了自己的方法
1赞 nevelis 6/16/2020
啊,这是一个有趣的方法......它需要自定义逻辑来解析,并且它将注释从它所描述的事物上移开......?
1赞 Rounin 6/16/2020
如果您想在正确的位置查看评论,则需要自定义编写的阅读器。否则(即通常)在JSON的底部,在根级别上,只有一个注释块,带有保留名称,可以安全地忽略并保留。
0赞 khashashin 10/5/2020 #50

我真的很喜欢@eli的方法,有 30 多个答案,但没有人提到列表(数组)。因此,使用 @eli 的方法,我们可以做这样的事情:

"part_of_speech": {
  "__comment": [
    "@param {String} type - the following types can be used: ",
      "NOUN, VERB, ADVERB, ADJECTIVE, PRONOUN, PREPOSITION",
      "CONJUNCTION, INTERJECTION, NUMERAL, PARTICLE, PHRASE",
    "@param {String} type_free_form - is optional, can be empty string",
    "@param {String} description - is optional, can be empty string",
    "@param {String} source - is optional, can be empty string"
  ],
  "type": "NOUN",
  "type_free_form": "noun",
  "description": "",
  "source": "https://google.com",
  "noun_class": {
    "__comment": [
      "@param {String} noun_class - the following types can be used: ",
        "1_class, 2_class, 3_class, 4_class, 5_class, 6_class"
    ],
    "noun_class": "4_class"
  }
}
39赞 Audrius Meškauskas 11/19/2020 #51

是的,新标准 JSON5 允许 C++ 样式注释,以及许多其他扩展

// A single line comment.

/* A multi-
   line comment. */

JSON5 数据交换格式 (JSON5) 是 JSON 的超集,旨在减轻 JSON 的一些限制。它完全向后兼容,使用它可能比编写自定义非标准解析器、为现有解析器打开非标准功能或使用各种技巧(如字符串字段)进行注释要好。或者,如果使用的解析器支持,只需同意我们使用的是 JSON 5 子集,即 JSON 和 C++ 样式的注释。这比我们按照我们认为合适的方式调整JSON标准要好得多。

已经有 npm 包、Python 包、Java 包C 库可用。它是向后兼容的。我认为没有理由坚持“官方”JSON限制。

我认为从 JSON 中删除注释的原因与删除 Java 中的运算符重载的原因相同:可以以错误的方式使用,但一些明显合法的用例被忽略了。对于算子重载,它是矩阵代数和复数。对于 JSON 注释,它是配置文件和其他文档,可以由人类编写、编辑或读取,而不仅仅是由解析器编写、编辑或读取。

评论

1赞 Xavi Montero 3/28/2021
JSON5 是“非常”标准的吗?还是仍在被采用?我的意思是。。。我可以期望 2021 年的任何框架都能理解 Json5 吗?或者很可能不是?
0赞 Audrius Meškauskas 3/29/2021
如果您创建了自己的标准,那么您就是世界上唯一使用它的人。像 JSON5 这样的东西可能更好。
0赞 Xavi Montero 3/30/2021
不是为了创建我的标准......只是想知道是否是时候考虑 JSON5 或更好的了,坚持使用“旧 JSON”并等待几个月,然后再花时间进行探索。
0赞 zkldi 8/4/2021
JSON5 不是“新标准”——它是由不同的人开发的独立标准。
-2赞 Boppity Bop 3/11/2021 #52

JSON 中需要注释,并且至少在 .NET Core JSON 和 Newtonsoft Json 中提供注释。完美工作。

{
  // this is a comment for those who is ok with being different
  "regular-json": "stuff"...
}

评论

0赞 AFract 3/17/2021
我认为您应该指定正确的语法以提供完整的答案。
4赞 Evert 3/21/2021
如果有 JSON 解析器可以解析非标准 JSON,这并不意味着允许在 JSON 中添加注释。
0赞 oligofren 12/21/2021
您有一个不遵循 JSON 规范的解析器并不意味着它是 JSON 的一个功能。您可以通过多种方式解决缺少注释的问题,其中一些已在此处提及,包括规范中的注释,但如果根据架构验证 json,仍可能失败。"// key" : "comment"
1赞 Boppity Bop 12/25/2021
如果它看起来像一个评论,并且像一个评论一样工作,那么我称之为评论就足够了。如果你想要一个100%纯的定义,你应该去数学网站讨论“真空中球形骑士的困境”。谢谢
10赞 peak 6/25/2021 #53

正如JSON的发明者所说

JSON 没有注释。JSON 编码器不得输出注释。JSON 解码器可以接受和忽略注释。

实用程序 jq 包含一个解码器,该解码器允许“#”样式的注释,因此 jq 是可以与带有注释的 JSON 文件结合使用的几种工具之一,只要这些文件被视为“ 程序”,而不是 JSON 文件。例如:

$ jq -ncf <(echo $'[1, # one\n2 ] # two') 
[1,2]

更重要的是,jq 可以将非常大的带有注释的 JSON 文件作为程序处理;这可以使用一个众所周知的 JSON 文件来说明:

$ ls -l JEOPARDY_QUESTIONS1.json
-rw-r--r--  2 xyzzy  staff  55554625 May 12  2016 JEOPARDY_QUESTIONS1.json

$ jq -nf JEOPARDY_QUESTIONS1.json | jq length
216930
9赞 dilshan 8/14/2021 #54

纯粹的答案是否定的

但是一些编辑器和平台使用变通方法向 JSON 添加注释。

1. 如今,大多数编辑器都有内置选项和扩展来向 JSON 文档添加注释。(例如:- VS Code 也有一个带有注释的 JSON / VS Code 也有很好的扩展)(jsonc) mode

在 VsCode 中激活 jsonc 模式的链接

2. 部分平台提供内置添加注释的方式(不纯json)。 (例如:- 在 firebase 中,我可以毫无问题地评论一段时间。firebase.json

    {
    "hosting": {
        "headers": [
            /*{
              "source": "*.html",
              "headers": [
                {
                  "key": "Content-Security-Policy",
                  "value": "default-src 'self' ..."
                }
              ]
            },*/
        ]
      }
    }

3. 在您自己的 JSON 解析方法中,您可以将预定义的键名设置为注释。

例如:-

     {
        "comment" : "This is a comment",
        "//" :  "This also comment",
        "name" : "This is a real value"
     }

评论

0赞 dsg38 10/6/2021
对于简单的用例,使用 VS Code 的 .jsonc 扩展是一个很好的选择
4赞 user585968 11/28/2021 #55

好吧,在撰写本文时,appsettings.json支持评论。

例如(示例由 Microsoft 提供)

{
  "Logging": {
    "LogLevel": { // All providers, LogLevel applies to all the enabled providers.
      "Default": "Error", // Default logging, Error and higher.
      "Microsoft": "Warning" // All Microsoft* categories, Warning and higher.
    },
    "Debug": { // Debug provider.
      "LogLevel": {
        "Default": "Information", // Overrides preceding LogLevel:Default setting.
        "Microsoft.Hosting": "Trace" // Debug:Microsoft.Hosting category.
      }
    },
    "EventSource": { // EventSource provider
      "LogLevel": {
        "Default": "Warning" // All categories of EventSource provider.
      }
    }
  }
}
6赞 Andrew 12/16/2021 #56

虽然 JSON 不支持注释,但 JSONC 支持。

使用扩展名为“.jsonc”的文件,并使用 jsonc 解析器。
对不起,如果这个答案为时已晚。

jsonWithComments.jsonc

例:

{
    // This is a comment!
    "something": "idk"

}

如果不清楚,我认为机器人很奇怪。 在将此问题投票为无帮助之前,请尝试。

评论

1赞 Community 12/16/2021
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Barney Szabolcs 1/11/2022
+1,我喜欢你的回答。而且它也被实施了......例如。Python 有 jsonc 解析器:pypi.org/project/jsonc-parser C/C++ 也有各种:stackoverflow.com/questions/36471581/c-c-json-parser/36471724
11赞 EKanadily 2/17/2022 #57

json specs 不支持注释,但您可以通过将注释编写为键来解决问题,如下所示

{
  "// my own comment goes here":"",
  "key1":"value 1",

  "// another comment goes here":"",
  "key 2": "value 2 here"
}

这样,我们使用注释文本作为键,确保(几乎)它们是唯一的,并且它们不会破坏任何解析器。如果您的某些评论不是唯一的,只需在末尾添加随机数即可。

如果您需要解析注释以执行任何处理(例如剥离它们),则可以使用指示它是注释的文本填充注释值,如下所示:

   {
  "// my own comment goes here" : "_comment",
  "key1":"value 1",

  "// another comment goes here" : "_comment",
  "key 2": "value 2 here"
} 
  

这样,解析器可以找到所有注释并对其进行处理。

1赞 Gabriel Staples 1/25/2023 #58

我搜索了所有页面的答案,没有一个提到 GitHub 或 Stack Overflow 上的 JSON 语法突出显示,尽管这个答案很接近

一些 JSON 解析器接受 C++ 样式的注释。例如,要在 GitHub 或 Stack Overflow 上编写 markdown 时触发它们,您可以将语法突出显示类型指定为 .例:jsonc

这:

```jsonc
// C++-style comment here
{
    "*.md": {
        "softwrap": true
    },
    "colorcolumn": 80,
    "savecursor": true,
    "scrollbar": true,
    "scrollspeed": 5,
    "softwrap": true,
    "wordwrap": true
}
```

产生这个:

// C++-style comment here
{
    "*.md": {
        "softwrap": true
    },
    "colorcolumn": 80,
    "savecursor": true,
    "scrollbar": true,
    "scrollspeed": 5,
    "softwrap": true,
    "wordwrap": true
}

正如我上面提到的答案,您可以使用令人惊叹的 nlohmann json C++ 库解析具有 C() 和 C++ () 样式注释的 JSON。/* *///

它在这里:https://github.com/nlohmann/json

您需要的单个头文件如下:https://github.com/nlohmann/json/blob/develop/include/nlohmann/json.hpp

该库是这样说的: https://github.com/nlohmann/json#comments-in-json

JSON 中的注释

默认情况下,此库不支持注释。这样做有三个原因:

  1. 注释不是 JSON 规范的一部分。你可能会争辩说,在 JavaScript 中是允许的,但 JSON 不是 JavaScript。///* */
  2. 这不是一个疏忽:道格拉斯·克罗克福德(Douglas Crockford)在2012年5月写道

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

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

  1. 如果某些库会添加注释支持,而其他库则不添加注释支持,那么互操作性将是危险的。请查看鲁棒性原则的有害后果

但是,您可以在函数中将 set 参数传递给 true 以忽略或注释。然后,注释将被视为空格。ignore_commentsparse///* */

ignore_comments是 和 是传递给函数的最后一个参数。看这里: https://json.nlohmann.me/api/basic_json/parse/boolnlohmann::json::parse()

引用:

  1. https://gist.github.com/DamianEdwards/31d2457737304ca73556?permalink_comment_id=3574928#gistcomment-3574928
1赞 Muhammad Ali 3/26/2023 #59

“JSON 没有任何注释文档”

但是你可以试试这个方法添加注释,

通过添加带有注释和描述的键值对:

{
"key": "some value",
"comments":"this is a comment"
"description":"this is some description of the comment defined above"
}

原因:为什么JSON文件不允许注释(默认)?

因为注释通常被添加到源代码中以描述代码行。JSON纯粹是关于要发送的数据格式,因此在Json中添加注释是不可行的。

希望它有所帮助。

评论

0赞 Alex Riabov 8/31/2023
为什么不能使用 JSON 中的注释来描述数据?JSON不再仅用于传输数据,还用作配置文件。
0赞 Stas Golubev 11/28/2023 #60

我认为没有这样的方法。IDE也这么说。它只是不受支持enter image description here

0赞 Tea_Drinker 12/8/2023 #61

我从 JSON 中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性。

——道格拉斯·克罗克福德

我从依赖项中删除了 JSON,因为我看到 Douglas Crockford 让它变得不可注释,这种做法破坏了互操作性。

--我

结论:使用 YAML