可以在 JSON 中使用注释吗?

我可以在JSON文件中使用注释吗?如果可以的话要怎么写?

3301379 次浏览

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

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背后的想法是提供应用程序之间的简单数据交换。这些通常是基于Web的,语言是JavaScript。

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

总而言之,JSON文件不应该包含传统意义上的注释。它应该只是数据。

查看JSON网站以获取更多详细信息。

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

答复:这将是一个单行。如果您这样做,那么JSON文件可以用作配置文件。

如果您选择,请包含注释;在解析或传输之前,用小型器将它们去掉。

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

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

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

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

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

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

示例:

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

您可以使用字段说明模式属性提供留档。

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

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

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

其他JavaScript工具包也可以类似地工作。

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

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

JSON可以做他们能做的一切,但它不那么冗长,更具人类可读性——解析器在许多语言中很容易并且无处不在。它只是一棵数据树。但是带外注释是必要的,通常是为了记录“默认”配置等。配置永远不会是“完整文档”,而是保存的数据树,在需要时可以人类可读。

我想可以使用"#": "comment"来表示“有效”的JSON。

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

注释不是官方标准,尽管一些解析器支持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

JSONTOML的替代品。

另一种选择是jsonc

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

通过设计从JSON中删除了注释。

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

假设您正在使用JSON来保存您想注释的配置文件。继续插入您喜欢的所有注释。然后通过JSMin管道将其交给您的JSON解析器。

来源:Douglas Crockford关于G+的公开声明

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

另一个堆栈溢出问题

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文件传递给解析器之前,不要忘记从JSON文件中删除注释!

JSON本身不支持注释,但您可以制作自己的解码器或至少预处理器来去掉注释,这完全没问题(只要您忽略注释并且不使用它们来指导您的应用程序应该如何处理JSON数据)。

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

评论永远不应该被用来传递任何有意义的东西什么是JSON

参考:Douglas Crockford, JSON规范的作者

免责声明:您的保证无效

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

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

黑客愉快!

可以JSONP中有注释,但不是纯JSON。我刚刚花了一个小时试图让我的程序与这个例子来自海图一起工作。

如果你点击链接,你会看到

?(/* 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请求,并意识到Content-type是text/javascript,因为JSONP返回纯JavaScript。在这种情况下,注释被允许。但是我的应用程序返回了Content-typeapplication/json,所以我不得不删除注释。

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

{
"#############################" : "Part1",
"data1"             : "value1","data2"             : "value2",
"#############################" : "Part2",
"data4"             : "value3","data3"             : "value4"
}

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

{"note1" : "This demonstrates the provision of annotations within a JSON file","field1" : 12,"field2" : "some text",
"note2" : "Add more annotations as necessary"}

只要确保您的“Note x”名称不与任何真实字段冲突。

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));

有一个很好的解决方案(hack),它是有效的JSON,但并非在所有情况下都能奏效(见下面的评论)。只需创建相同的键两次(或更多)。例如:

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

所以JSON会这样理解:

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

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

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

你可以有这样的评论:

{key: "value" // Comment}

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

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

但一般来说(如前所述)规范不允许注释。

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

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

Hjson intro

JavaScript、Java、Python、PHP、Rust、Go、Ruby、C++和C#库见hjson.github.io

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

不,您不应该使用重复的对象成员将侧通道数据填充到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;

我找到了“grunt-条带-json-评论”。

"从JSON中删除注释。它允许您在JSON文件中使用注释!"

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

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

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

它取代了任何评论,例如:

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

它取代了任何评论,例如:

// Hey
/\/\/.*/

在JavaScript中,你可以这样做:

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

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

module.exports = {"key": "value",
// And with comments!"key2": "value2"};

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

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

//接口名

//标识类型

/*这是一个

评论示例*/

PS:单行注释仅支持6个以上版本的Newtonsoft Json。

对于那些不能跳出盒子思考的人来说:我在我制作的ASP.NETWeb应用程序中使用JSON格式进行基本设置。我读取文件,使用Newtonsoft库将其转换为设置对象并在必要时使用它。

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

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

如果您对这种用法有问题;对不起,精灵已经离开了灯。人们会发现JSON格式的其他用法,您对此无能为力。

我们正在为我们的项目使用#0。它支持以下内容:

/** 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'}

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

一个值得注意的例子是"Hashcorp语言"(HCL)"。它是由制造Vagrent,Packer,consul和vault的人编写的。

JSON不是框架协议。它是语言自由格式。所以注释的格式没有为JSON定义。

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

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

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


JSON5是对JSON的提议扩展旨在让人类更容易手工编写和维护。它通过直接从ECMAScript 5中添加一些最小的语法功能来做到这一点。

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

来自JSON的创建者:

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

官方JSON站点位于JSON.org。JSON被ECMA International定义为标准。总是有一个请愿过程来修改标准。出于几个原因,不太可能将注释添加到JSON标准中。

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

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

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

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

注释只会降低JSON的互操作性。除非您真正需要的是置标语言(XML),并且不关心您的持久数据是否容易解析,否则没有其他东西可以添加。

但是作为JSON的创建者也观察到,一直有JS管道支持评论:

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

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

例如,您可以为此使用分解库。下面是一个完整的示例。

输入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 commentsvar json = JSON.parse(text); // parsing JSONconsole.log(json);}});

输出:

{ value: 123 }

请参阅:吞咽分解咕噜声腐烂

您可以使用JSON-LDschema.org评论类型来正确编写注释:

{"https://schema.org/comment": "this is a comment"}

如果您使用的是PHP,您可以使用此函数在将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;}

希望这有帮助!

在我的情况下,我需要在JSON输出之前使用注释进行调试。所以我把调试信息放在http标头中,以避免破坏客户端:

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

在此处输入图片描述

是的,你可以发表意见。但我不会推荐上述任何理由。

我做了一些调查,我发现所有的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 */}

您可以通过正则表达式使用简单的预处理。例如,以下函数将在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风格的注释: /*, #, //. 字符串文字保持原样。

这是我在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"}

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

*. 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,'')

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

它很实用,因为这是Visual Studio Code认可的扩展,表示“带有注释的JSON”。请在下面的评论中告诉我其他编辑器/IDE的信息。

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

(在发布这个之前,我搜索了所有的答案,没有一个提到“jsonc”。

当然你可以注释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.});

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

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

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] == "//":continueif 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}"""))

免责声明:这是愚蠢的

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

您可能会滥用以下内容:

在任何令牌之前或之后允许使用无关紧要的空格。空白是以下一个或多个代码的任何序列积分:字符制表(U+0009)、换行(U+000A)、滑行返回(U+000D)和空间(U+0020)。

您可以以一种老套的方式滥用它来添加注释。例如:使用制表符开始和结束您的注释。在base 3中对注释进行编码并使用其他空格字符来表示它们。例如。

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

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

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

我从来没有尝试过,出于明显的原因,你也不应该。

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

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

喜欢:

  1. JSON5
  2. Visual Studio Code
  3. 评论

是的。您可以将注释放入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中多次指定键,所以你可以这样做。它在语法上是正确的,唯一的权衡是你的字典中有一个空键和一些垃圾值(你可以修剪…)

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

我真的很喜欢@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"}}

,新标准,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注释,它是配置文件和其他可以由人类编写、编辑或读取的文档,而不仅仅是解析器。

在JSON和注释至少在. NET Core中可用 JSON和Newtonsoft Json中需要注释。完美工作。

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

JSON的发明者说

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

实用程序包含一个允许“#”风格注释的解码器,因此jq是可以与带有注释的JSON文件结合使用的几种工具之一,只要此类文件被视为“jq程序”,而不是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 length216930

纯答案是

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

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

链接到VsCode中激活jsonc模式

2。一些平台提供了内置的添加注释的方式(imure json)。(例如:-在Firebase中,我可以评论firebase.json一段时间而没有问题。

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

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

eg:-

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

在撰写本文时,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.}}}}

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

使用“. jsonc”扩展名命名您的文件并使用jsonc解析器。
我很抱歉我的回答太迟了

jsonWithComments.jsonc

示例:

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

如果这不清楚,我认为机器人很奇怪。请在投票之前尝试这个问题是无益的。

JSON规范不支持注释,但是你可以通过将注释写成键来解决这个问题,就像这样

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

通过这种方式,解析器可以找到所有注释并处理它们。