我可以在JSON文件中使用注释吗?如果是这样,怎么办?
1个 2 下一个 没有。 JSON仅是数据,如果包含注释,那么它也将是数据。 您可能有一个名为“ _comment”(或其他名称)的指定数据元素,使用JSON数据的应用程序应忽略该数据元素。 在生成/接收JSON的过程中添加注释可能会更好,因为它们应该事先知道什么是JSON数据,或者至少知道其结构。 但是,如果您决定: { “ _comment”:“评论文字在这里...”, “词汇表”:{ “ title”:“词汇表示例”, “ GlossDiv”:{ “ title”:“ S”, “ GlossList”:{ “ GlossEntry”:{ “ ID”:“ SGML”, “ SortAs”:“ SGML”, “ GlossTerm”:“标准通用标记语言”, “首字母缩写”:“ SGML”, “ Abbrev”:“ ISO 8879:1986”, “ GlossDef”:{ “ para”:“一种元标记语言,用于创建诸如DocBook之类的标记语言。”, “ GlossSeeAlso”:[“ GML”,“ XML”] }, “ GlossSee”:“标记” } } } } } | 不,JSON中不允许使用///…或/ *…* /形式的注释。该答案基于: https://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不支持注释。也从来没有打算将其用于需要注释的配置文件。 Hjson是人类的配置文件格式。轻松的语法,更少的错误,更多的注释。 有关JavaScript,Java,Python,PHP,Rust,Go,Ruby,C ++和C#库,请参见hjson.github.io。 | 免责声明:您的保修无效 正如已经指出的那样,这种黑客利用了规范的实现。并非所有JSON解析器都会理解这种JSON。流解析器尤其会阻塞。 这是一个有趣的好奇心,但是您真的不应该将它用于任何用途。以下是原始答案。 我发现了一个小技巧,可让您将注释放入不影响解析的JSON文件中,或以任何方式更改表示的数据。 似乎在声明对象文字时,可以使用相同的键指定两个值,最后一个优先。信不信由你,事实证明JSON解析器的工作方式相同。因此,我们可以使用它在源JSON中创建注释,这些注释将不会出现在已解析的对象表示中。 ({a:1,a:2}); // =>对象{a:2} Object.keys(JSON.parse('{“ a”:1,“ a”:2}'))。length; // => 1 如果我们应用此技术,则您注释的JSON文件可能如下所示: { “ api_host”:“ API服务器的主机名。您也可以指定端口。 “ api_host”:“ hodorhodor.com”, “ retry_interval”:“重试失败的API调用之间的间隔,以秒为单位”, “ retry_interval”:10, “ auth_token”:“身份验证令牌。它可以在开发人员仪表板的“设置”下找到”, “ auth_token”:“ 5ad0eb93697215bc0d48a7b69aa6fb8b”, “ favorite_numbers”:“一个包含我历史上最喜欢的数字的数组”, “ favorite_numbers”:[19,13,53] } 上面的代码是有效的JSON。如果您解析它,将得到一个这样的对象: { “ api_host”:“ hodorhodor.com”, “ retry_interval”:10, “ auth_token”:“ 5ad0eb93697215bc0d48a7b69aa6fb8b”, “收藏夹编号”:[19,13,53] } 这意味着没有评论的痕迹,并且它们不会有怪异的副作用。 骇客入侵! | 考虑使用YAML。它几乎是JSON的超集(几乎所有有效的JSON都是有效的YAML),并且允许注释。 | 你不能至少快速浏览一下json.org是我的经验。 JSON有其语法在该页面上可视化。没有关于注释的任何注释。 | 注释不是官方标准,尽管某些解析器支持C ++样式的注释。我使用的一个是JsonCpp。在示例中有一个: //配置选项 { //文字的默认编码 “ encoding”:“ UTF-8”, //在启动时加载插件 “插件”:[ “蟒蛇”, “ c ++”, “红宝石” ], //制表符缩进大小 “ indent”:{“ length”:3,“ use_space”:true} } jsonlint不会对此进行验证。因此,注释是解析器特定的扩展,而不是标准的。 另一个解析器是JSON5。 JSON TOML的替代方法。 另一个选择是jsonc。 最新版本的nlohmann / json具有可选支持,可忽略对解析的注释。 | 您应该改为编写JSON模式。 JSON模式是当前提议的Internet草案规范。除了文档之外,该模式还可以用于验证JSON数据。 例: { “ description”:“一个人”, “ type”:“对象”, “属性”: { “名称”: { “ type”:“ string” }, “年龄”: { “ type”:“整数”, “最大”:125 } } } 您可以通过使用描述架构属性来提供文档。 | 如果您将Jackson用作JSON解析器,则可以通过以下方式启用它以允许注释: ObjectMapper映射器=新的ObjectMapper()。configure(Feature.ALLOW_COMMENTS,true); 然后,您可以有如下评论: { 键:“值” //注释 } 您还可以通过设置以下内容以#开头的注释: mapper.configure(Feature.ALLOW_YAML_COMMENTS,true); 但是总的来说(如前所述),该规范不允许发表评论。 | 这是我在Google Firebase文档中找到的内容,可让您将注释放入JSON: { “ //”:“某些浏览器将使用它来启用推送通知。”, “ //”:“所有项目都相同,这不是您项目的发件人ID”, “ gcm_sender_id”:“ 1234567890” } | 没有。 JSON曾经支持注释,但是它们被滥用并从标准中删除。 来自JSON的创建者: 我从JSON中删除了注释,因为我看到人们正在使用它们保留解析指令,这种做法会破坏互操作性。我知道缺少评论会让某些人感到难过,但事实并非如此。 -道格拉斯·克罗克福德(Douglas Crockford),2012年 官方JSON网站位于JSON.org。 JSON被ECMA International定义为标准。总有一个请愿程序来修改标准。由于多种原因,注释不太可能被添加到JSON标准中。 通过设计,JSON是XML的一种易于反向工程(人工分析)的替代方案。甚至简化到不需要注释的地步。它甚至不是标记语言。目标是稳定和互操作性。 任何了解面向对象的“具有”关系的人都可以理解任何JSON结构-这就是重点。它只是带有节点标签(键/值对)的有向无环图(DAG),这是一种几乎通用的数据结构。 唯一需要的注释可能是“ //这些是DAG标签”。关键字名称可以根据需要提供丰富的信息,从而可以进行任意语义匹配。 任何平台都可以仅用几行代码来解析JSON。 XML需要复杂的OO库,这些库在许多平台上都不可行。 注释只会使JSON的互操作性降低。除非您真正需要的是标记语言(XML),否则根本就没有其他要添加的内容,并且不必关心持久性数据是否易于解析。 但是作为JSON的创建者,也观察到,一直有JS管道支持注释: 继续并插入您喜欢的所有评论。 然后将其通过JSMin传递给JSON分析器。 -道格拉斯·克罗克福德(Douglas Crockford),2012年 | 如果某个程序将读取您的文本文件(即JSON字符串),那么在使用它之前剥离C或C ++样式的注释会有多困难? 答:那将是一个班轮。如果这样做,则可以将JSON文件用作配置文件。 | 如果您将Newtonsoft.Json库与ASP.NET一起使用来读取/反序列化,则可以在JSON内容中使用注释: //“ name”:“ string” //“ id”:int 要么 /* 这是一个 注释示例* / PS:单行注释仅在6+版本的Newtonsoft Json中受支持。 对于那些想不开箱即用的人的补充说明:我将JSON格式用于我制作的ASP.NET Web应用程序中的基本设置。我阅读了文件,并使用Newtonsoft库将其转换为设置对象,并在必要时使用它。 我更喜欢在JSON文件本身中编写有关每个设置的注释,只要我使用的库可以,我就真的不在乎JSON格式的完整性。 我认为这比创建单独的“ settings.README”文件并解释其中的设置“更易于使用/理解”。 如果您对这种用法有疑问;抱歉,精灵没电了。人们会发现其他用途JSON格式,您无能为力。 | JSON背后的想法是提供应用程序之间的简单数据交换。这些通常是基于Web的,并且语言是JavaScript。 它实际上并不允许这样的注释,但是,尽管将数据显然需要解析代码特别地忽略或处理,但将注释作为数据中的名称/值对之一传递肯定会起作用。 综上所述,JSON文件不应该包含传统意义上的注释。它应该只是数据。 请访问JSON网站以获取更多详细信息。 | JSON本身不支持注释,但是您可以使用自己的解码器或至少预处理器来剥离注释,这非常好(只要您只是忽略注释并且不使用它们来指导应用程序应如何处理JSON数据)。 JSON没有评论。 JSON编码器不得输出注释。 JSON解码器可以接受和忽略注释。 注释绝不能用于传达任何有意义的内容。那是 JSON是什么。 cf:JSON规范的作者Douglas Crockford。 | 我只是在配置文件中遇到此问题。我不想使用XML(冗长,图形化,丑陋,难以阅读)或“ ini”格式(无层次结构,没有真正的标准等)或Java“属性”格式(如.ini)。 JSON可以完成他们所能做的一切,但是它的冗长程度不高,更易被人阅读-并且解析器在许多语言中都很容易实现。这只是一棵数据树。但是带外注释通常是记录“默认”配置等的必要条件。配置绝不能是“完整文档”,而可以是需要时人类可读的保存数据树。 我猜一个人可以为“有效” JSON使用“#”:“ comment”。 | 这取决于您的JSON库。 Json.NET支持JavaScript样式的注释,/ *注释* /。 请参阅另一个堆栈溢出问题。 | JSON对于配置文件和其他本地用法很有意义,因为它无处不在,并且比XML更简单。 如果人们在通信数据时(无论是否有效)有强烈的理由反对在JSON中添加注释,则可以将JSON分为两种: JSON-COM:在线上的JSON,或在传递JSON数据时适用的规则。 JSON-DOC:JSON文档,或文件中或本地的JSON。定义有效JSON文档的规则。 JSON-DOC将允许注释,并且可能存在其他小的差异,例如处理空格。解析器可以轻松地从一种规格转换为另一种规格。 关于道格拉斯·克罗克福德(Douglas Crockford)在此问题上的评论(@Artur Czajka引用) 假设您正在使用JSON保留要注释的配置文件。继续并插入您喜欢的所有评论。然后将其通过JSMin传递给JSON分析器。 我们正在谈论一个通用的配置文件问题(跨语言/跨平台),而他正在使用JS特定实用程序来回答! 确保可以用任何语言实现特定于JSON的minify, 但是对此进行了标准化,以使其在所有语言和平台的解析器中无处不在,因此人们不再浪费时间缺少该功能,因为他们有很好的用例,在在线论坛上查找问题,并让人们告诉他们这是一个坏主意或建议很容易实现从文本文件中剥离注释。 另一个问题是互操作性。假设您有一个库或API或任何与某些配置或数据文件相关联的子系统。这个子系统是 可以从不同的语言访问。那你要告诉别人:顺便说一句 不要忘记将注释从JSON文件中删除,然后再将其传递给解析器! | 如果您使用JSON5,则可以包含注释。 JSON5是对JSON的提议扩展,旨在使人类更轻松地手工编写和维护。它通过直接从ECMAScript 5添加一些最小的语法功能来做到这一点。 | Dojo Toolkit JavaScript工具箱(至少从1.4版开始)允许您在JSON中包含注释。注释可以是/ * * /格式。 Dojo Toolkit通过dojo.xhrGet()调用使用JSON。 其他JavaScript工具箱也可能类似地工作。 在选择最终选项之前尝试使用备用数据结构(甚至数据列表)时,这可能会有所帮助。 | JSON不是框架协议。这是一种无语言格式。因此,未为JSON定义注释的格式。 正如许多人所建议的那样,有一些技巧,例如,可以使用重复键或特定键_comment。由你决定。 | 您可以在JSONP中添加注释,但不能在纯JSON中添加注释。我只花了一个小时就试图使我的程序在Highcharts中使用此示例:http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=? 如果您点击链接,将会看到 ?(/ * AAPL来自Google Finance API的历史OHLC数据* / [ / * 2006年5月* / [1147651200000,67.79], [1147737600000,64.98], ... [1368057600000,456.77], [1368144000000,452.97] ]); 由于我的本地文件夹中有一个类似的文件,因此同源策略没有问题,所以我决定使用纯JSON ...,当然,由于注释,$。getJSON会自动失败。 最终,我只是向上面的地址发送了一个手动HTTP请求,并意识到内容类型是text / javascript,因为JSONP返回的是纯JavaScript。在这种情况下,允许注释。但是我的应用程序返回了内容类型application / json,因此我不得不删除注释。 | 这是一个“可以吗”的问题。这是一个“是”的答案。 不,您不应该使用重复的对象成员将旁通道数据填充到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; | 免责声明:这很愚蠢 实际上,有一种添加注释并保持在规范内的方法(无需其他解析器)。但是,如果不进行任何形式的解析,它将不会导致人类可读的注释。 您可能会滥用以下内容: 在任何令牌之前或之后都可以使用无关紧要的空格。 空格是以下一个或多个代码的任何序列 点数:字符列表(U + 0009),换行符(U + 000A),回车 返回(U + 000D)和空格(U + 0020)。 您可以滥用方式添加评论。例如:用标签开始和结束您的评论。在base3中编码注释,并使用其他空格字符表示它们。例如。 010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202 (您好,以ASCII为基数的三位)但不是0使用空格,而是1使用换行,2使用回车。 这只会给您留下很多不可读的空格(除非您制作一个IDE插件来对其进行动态编码/解码)。 由于明显的原因,我什至从未尝试过,您也不应该尝试。 | JSON本身不允许评论。推理完全是愚蠢的,因为您可以使用JSON本身来创建注释,从而完全避免推理,并且出于完全相同的结果和潜在问题而完全没有理由加载解析器数据空间,例如:JSON带有注释的文件。 如果尝试放入注释(例如使用//或/ * * /或#),则某些解析器将失败,因为严格来说这不是 在JSON规范中。因此,您绝对不要那样做。 例如,在这里,我的图像处理系统保存了图像符号和一些与它们有关的基本格式化(注释)信息(在底部): { “符号”:[ { “ anchorX”:333, “ anchorY”:265, “ areaMode”:“椭圆”, “ extentX”:356, “ extentY”:294, “不透明度”:0.5, “ text”:“椭圆形在顶部”, “ textX”:333, “ textY”:265, “ title”:“注释1” }, { “ anchorX”:87, “ anchorY”:385, “ areaMode”:“矩形”, “ extentX”:109, “ extentY”:412, “不透明度”:0.5, “ text”:“区域\非底部”, “ textX”:98, “ textY”:385, “ title”:“注释2” }, { “ anchorX”:69, “ anchorY”:104, “ areaMode”:“多边形”, “ extentX”:102, “ extentY”:136, “不透明度”: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”:“简单多边形”, “ textX”:85, “ textY”:104, “ title”:“注释3” } ], “ imageXW”:512, “ imageYW”:512, “ imageName”:“ lena_std.ato”, “ tinyDocs”:{ “ c01”:“ JSON图片符号数据:”, “ c02”:“ -------------------------”, “ c03”:“”, “ c04”:“此数据包含图像符号和相关区域”, “ c05”:“选择信息,为某人提供手段”, “ c06”:“图像库以椭圆显示符号,”, “ c07”:“矩形,多边形或手绘区域指示”, “ c08”:“在显示给画廊访客的图像上。”, “ c09”:“”, “ c10”:“ X和Y位置都在图像中空间。图片”, “ c11”:“分辨率指定为imageXW和imageYW,其中” “ c12”:“您习惯于将符号区域缩放到适当的比例”, “ c13”:“图像显示的位置和大小,”, “ c14”:“不管规模。”, “ c15”:“”, “ c16”:“对于椭圆,锚点是椭圆的中心,”, “ c17”:“和范围分别是X和Y半径。”, “ c18”:“”, “ c19”:“对于矩形,锚点位于左上角,”, “ c20”:“范围在右下角。”, “ c21”:“”, “ c22”:“对于徒手和多边形区域模式,为pointList”, “ c23”:“包含一系列编号的XY点。如果是区域,” “ c24”:“已关闭,最后一点将与”相同,“ “ c25”:“首先,所以您只需要考虑绘图”, “ c26”:“列表中各点之间的线。锚点和范围”, “ c27”:“设置为所指示的左上方和右下方”, “ c28”:“区域,并且可以用作简单的矩形”, “ c29”:“检测这些类型上的鼠标悬停位置”, “ c30”:“区域。”, “ c31”:“”, “ c32”:“ textx和texty位置提供基本定位”, “ c33”:“可帮助您找到文本信息的信息”, “ c34”:“在与该区域相关的合理位置”, “ c35”:“指示”, “ c36”:“”, “ c37”:“不透明度是介于0和1之间的值,其中.5表示”, “ c38”:“ 50%的不透明背景,而1.0则表示完全不透明”, “ c39”:“背景。建议绘制区域”, “ c40”:“仅当用户将指针悬停在图像上时,”, “ c41”:“并且绘制与区域关联的文本”, “ c42”:“仅当用户将指针悬停在指示的上方时,” “ c43”:“区域。” } } | 我们正在为项目使用strip-json-comments。它支持类似: / * *说明 * / { // 彩虹 “独角兽”:/ *❤* /“蛋糕” } 只需npm install --save strip-json-comments即可安装和使用它,如下所示: var strip_json_comments = require('strip-json-comments') var json ='{/ *彩虹* /“ unicorn”:“ cake”}';; JSON.parse(strip_json_comments(json)); // => {unicorn:'蛋糕'} | 就我而言,我需要在输出JSON结构之前使用注释进行调试。因此,我决定在HTTP标头中使用调试信息,以避免破坏客户端: header(“ My-Json-Comment:是的,我知道这是一种解决方法;-)”); | 要将JSON项目切成几部分,请添加“虚拟评论”行: { “#############################“ : “第1部分”, “ data1”:“ value1”, “ data2”:“ value2”, “#############################“ : “第2部分”, “ data4”:“ value3”, “ data3”:“ value4” } | 1个 2 下一个 高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。 不是您要找的答案?浏览其他标记有json注释的问题,或提出您自己的问题。