可以在 JSON 中使用注释吗?

问题描述:

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

解决方案1:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

不。

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

如果有一个名为 comment 的有效字段,则可能需要在实际评论上加上某种前缀:"__comment":"comment text goes here...",

顺便说一句,Java google-gson 的 json 库支持注释。

如果我想对 Accronym 和 Abbrev 属性进行单独评论怎么办?我以前使用过这种模式,但因为它不允许我这样做而停止了。这是一个黑客。也许如果我用 __comment__ 代替属性名称。那是“__comment__Abbrev”,仍然是一个 hack,但会让我评论所有的 prpoerties

您也可以使用“//”:这看起来更原生,并且在同一个父级中仍然可以重复

当 JSON 用于人为设计的配置文件时,应该对它们进行注释以便人们更好地理解。注释,这样的文件不再是有效的 JSON,但是有解决方案。例如,Google 的 GYP 支持 # 样式的注释。 JSON.Minify 将帮助您从输入文件中丢弃 C/C++ 样式的注释。

解决方案2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

否,JSON 中不允许使用 //… 或 // 形式的注释。这个答案基于:

https://www.json.org

RFC 4627:JavaScript 对象表示法 (JSON) 的 application/json 媒体类型

RFC 8259 JavaScript 对象表示法 (JSON) 数据交换格式(取代 RFC 4627、7158、7159)

如果您想用注释注释您的 JSON(从而使其无效 JSON),则在解析或传输之前将其缩小。 Crockford 本人在 2012 年在配置文件中承认了这一点。

@alkuzad:当涉及到形式语法时,必须有一些明确说明它们是允许的,而不是相反。例如,选择您的编程语言:仅仅因为某些期望(但缺少)的功能没有被明确禁止,并不意味着您的编译器会神奇地识别它。

是的。 JSON 格式在元素之间有很多死区,并且在这些区域中对空间不敏感,因此没有理由不能在其中添加单行或多行注释。许多解析器和压缩器也支持 JSON 注释,因此请确保您的解析器支持它们。 JSON 大量用于应用程序数据和配置设置,因此现在需要注释。 “官方规范”是一个好主意,但它还不够且过时,太糟糕了。如果您担心负载大小或性能,请缩小 JSON。

虽然你的答案是绝对正确的,但应该说这是BS。由于有如此多的最终用户遇到对 json 配置的需求,因此注释非常有用。仅仅因为一些锡箔帽决定 JSON 是并且必须始终是机器可读的,而忽略了人类需要阅读它的事实,恕我直言,这是对狭隘思想的讽刺。

@cmroanirgo:您显然不是第一个抱怨 JSON 限制的人......这就是为什么我们有静默允许注释的解析器以及 YAML 和 JSON5 等其他格式的原因。然而,这并没有改变 JSON 就是这样的事实。相反,我觉得有趣的是,人们开始使用 JSON 显然是不够的,因为存在问题。不要责怪 JSON 格式;责备自己坚持在不适合的地方使用它。

解决方案3:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

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

当我发布它时,我遭到了很多人的强烈反对,甚至不同意它的想法,所以我决定写一篇全面的博客文章来解释为什么comments make sense in JSON。它包括来自 JSON 的创建者的这条值得注意的评论:

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

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

JSON.minify() 唯一的问题是它真的很慢。所以我做了我自己的实现,做同样的事情: gist.github.com/1170297 。在一些大型测试文件上,您的实现需要 74 秒,而我的实现需要 0.06 秒。

如果您可以将建议的替代算法提交到 JSON.minify() 的 github 存储库,那就太好了,这样它就可以移植到所有受支持的语言:github.com/getify/json.minify

@MiniGod 我已经多次听到 Doug 对这个话题的想法。我很久以前在我的博文中提到过它们:blog.getify.com/json-comments

@MarnenLaibow-Koser 即使对于数据流(甚至数据包)的使用,注释仍然有效:包含诊断元数据(如创建时间或源)在 XML 中很常见,对于 JSON 数据也非常合理。反对评论的争论很肤浅,任何文本数据格式都应该允许评论,无论隐含的预期用途如何(没有规范建议 JSON 不能在其他地方使用,fwiw)

如果 JSON 要获得普遍接受(它基本上是这样),那么它应该具有普遍应用。示例:JSON 可以用作应用程序配置文件。此应用程序需要评论。

解决方案4:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

设计上从 JSON 中删除了评论。

我从 JSON 中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性。我知道缺少评论会让一些人感到难过,但不应该。假设您使用 JSON 来保存您想要注释的配置文件。继续并插入您喜欢的所有评论。然后通过 JSMin 将其通过管道传递给您的 JSON 解析器。

来源:Public statement by Douglas Crockford on G+

我认为 JSON 应该比 XML 更易于阅读?注释是为了便于阅读。

无论如何,您可能会很顽皮并在 JSON 中添加解析指令: {"__directives":{"#n#":"DateTime.Now"}, "validdate":"#n#"}... 它看起来像 YAML那是前进的方向……

个人观点:不允许评论是蹩脚的。除了构建一个忽略注释的非标准 JSON 解析器来解码我的配置文件之外,我别无选择。

“我从 JSON 中删除了注释,因为我看到人们使用它们来保存解析指令”。按照这个逻辑,他也应该删除字符串类型。可怕的决定。

这就像要求所有的自行车都有辅助轮,因为有些人不会骑自行车。因为愚蠢的人滥用它而删除一个重要功能是糟糕的设计。数据格式应该优先考虑可用性而不是白痴。

解决方案5:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

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

https://i.stack.imgur.com/u2E8q.gif

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

赞成。这显然是一个很好的变体,不开放的保守派人们只是喜欢讨厌。我希望你的实现能得到进一步的了解——甚至可能比原来的更受欢迎;)我希望有人也能用 Ruby 来实现它。 @adelphus 定义明确的语言是您自己的观点或意见。如果你是一个保守的“开发人员”,并不能证明你更好,你可能会更糟,把自己锁在有限的空间里。不要轻易将人们判断为糟糕的开发人员。

很抱歉,@konsolebox。或许您在阅读 ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 后可能会重新考虑您的“定义明确的 JSON 是您的意见”的观点,这是一个真正的标准,开发人员实施他们自己的“特殊”版本会导致碎片化、混乱和大量时间浪费。看看 Web 开发人员在编写代码时留下的混乱,只是因为每个浏览器实现的标准版本略有不同。 JSON 语言可能并不完美,但碎片化更糟糕。是的,这只是一种观点,你可以自由反对。

我很佩服你的进取心,但你有点重新发明 YAML。如果您想要很多灵活性和人类可读性,请使用 YAML(实际上不要:stackoverflow.com/questions/450399/…)或坚持使用粗俗但明确的 JSON。

我发现最用户友好的配置格式仍然是 INI。它很简单,而且语法不是很重。这使得只是将脚趾浸入配置池中的用户不那么令人生畏。

每当您需要 json 作为配置时(需要注释的地方)- 将文件命名为“.js”而不是“.json”.. js 当然可以处理任何有效的 json 对象并且还可以处理注释.. 这就是它的原因“webpack.config.js”而不是“webpack.config.json”(在 webpack 中也有更多原因:P)

解决方案6:

huntsbot.com – 高效赚钱,自由工作

免责声明:您的保修无效

正如已经指出的那样,这个黑客利用了规范的实现。并非所有 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]
}

上面的代码是 valid JSON。如果你解析它,你会得到一个像这样的对象:

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

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

快乐黑客!

从 the specification:对象中的名称应该是唯一的。

不保证 JSON 中元素的顺序。这意味着“最后一个”项目可能会改变!

这显然违反了规范(见上面的评论),不要这样做。 ietf.org/rfc/rfc4627.txt?number=4627

否 - 如果解析器正在流式传输怎么办?如果解析器将其读入未定义键顺序的字典中怎么办?用火杀死它。

由于我们一直在 JSON 工作组的 IETF 研究 RFC 4627bis(加入我们并提供帮助!datatracker.ietf.org/wg/json),我们发现了实现者用于对象中重复名称的四种不同方法:使用第一种;使用最后一个;报告所有这些,让来电者选择一个;返回错误并停止解析。如果您的数据无法在所有这些方法中幸存下来,那么它在实践中将无法互操作。

解决方案7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

@NateS 很多人已经指出答案是否定的。我提出了一种更好的方法来实现 OP 的目标。这是一个答案。

@marnen-laibow-koser:是的,为 Java 和 Perl 使用可用的 YAML 库并期望每个生成的 YAML 被另一个无错误地使用肯定是无能的。 YAML 互操作是一个问题,但 JSON 互操作不是,这完全是由于我缺乏知识。

@marnen-laibow-koser,用更简单的规范完成同样事情的格式更好。具有完美实现的实用格式优于具有不完美实现的理想格式。并非所有错误库的责任都在实施者的肩上。 YAML 规范冗长、密集且迟钝。它的维基百科条目引用了两个模棱两可的例子;如果必须在人类和格式之间放置一个发射器以保护他们免受歧义,那么格式就失去了对人类友好的主张。 JSON 声明较少,并且大部分成功,而 YAML 声明较多且不足。

@marnen-laibow-koser,我已经驳斥了你对我自己无能的暗示,用细节支持我的主张,并稍微详细说明了我的偏好/偏见,这些偏好/偏见为我的 YAML 批评提供了依据。我自己的进一步评论可能收益递减。我对未来读者做出明智选择的能力充满信心。除了避开人身攻击之外,感谢您的演讲。如果您愿意,最后一句话是您的。

@toolbear 无意进行人身攻击。 “具有完美实现的实用格式优于具有不完美实现的理想格式”——我不确定我是否同意。如果格式是理想的(并且可实现的),那么人们总是可以做出很好的实现。如果格式不理想,那么即使是完美的实现也不会很好。 :) “YAML 规范长、密集、钝”——这实际上不是“钝”的意思,但 YAML 规范非常清楚。我没有看到维基百科中提到的任何歧义;如果我遗漏了什么,请引用文章的特定部分。

解决方案8:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

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

解决方案9:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

注释不是官方标准,尽管一些解析器支持 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 提供了对忽略解析注释的可选支持。

Groovy 有一些 built-in classes for handling JSON。 JsonSlurper 可以处理评论。当然,官方规范中不允许注释,因此任何解析器中的这种行为都是非标准且不可移植的。

Newtonsoft Json.NET 也毫无问题地支持 C 风格的注释

恕我直言,这是该问题的最佳答案,因为它包含了许多确实支持的替代解析器的良好列表。不应鼓励使用重复或无关密钥的黑客行为,如果您想要/需要评论,您应该使用替代标准。

解决方案10:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

以下是我在 Google Firebase documentation 中找到的允许您在 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"
}

仅供参考,Firebase 实时数据库不允许在键中使用“/”。所以这可能是您自己使用的一个很好的约定,但您不能在 Firebase 中这样做

此方法破坏了一些要求密钥必须唯一的库。我正在通过给评论编号来解决这个问题。

很好的评论,我在 SO 上发现了这个问题......这部分似乎没有被规范 stackoverflow.com/questions/21832701/…

我现在倾向于这样使用它: { "//foo": "foo comment", "foo": "foo value", "//bar": "bar comment", "bar": "bar value" }您可以将数组用于多个评论: { "//foo": [ "foo comment 1", "foo comment 2" ], "foo": ''foo value" }

解决方案11:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

例子:

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

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

是的,json-schema google group 相当活跃,我建议使用 JSV 来实现 JSON Schema 验证器的良好 JavaScript 实现。

如果您使用 clojure(我相信您不使用),这里有一个功能合理的开源 JSON 模式解析器:github.com/bigmlcom/closchema

@Munhitsu Manatee.Json (.Net) 广泛支持 JSON 模式。

这并不适用于所有情况。我有一个手动配置的 JSON 以由具有自己架构的其他东西(包管理器)解析。我想要一个评论,例如 /* 最好使用 X 来代替另一个包管理器,但是那个管理器还没有提供 X。 */.

原文链接:https://www.huntsbot.com/qa/R3Jd/can-comments-be-used-in-json?lang=zh_CN

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值