可以在JSON中使用注释吗?

时间:2008-10-28 20:39:03

标签: json comments

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

58 个答案:

答案 0 :(得分:4698)

没有。

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

答案 1 :(得分:1682)

,JSON中不允许使用//…/*…*/表单的注释。这个答案基于:

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

答案 2 :(得分:740)

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

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

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

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

  

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

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

答案 3 :(得分:401)

评论已从设计中删除。

  

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

     

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

来源:Public statement by Douglas Crockford on G+

答案 4 :(得分:200)

免责声明:您的保修无效

正如已经指出的那样,这个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]
}

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

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

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

快乐的黑客攻击!

答案 5 :(得分:152)

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

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

Hjson intro

有关JavaScript,Java,Python,PHP,Rust,Go,Ruby和C#库的信息,请参阅hjson.org

答案 6 :(得分:101)

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

答案 7 :(得分:100)

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

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

答案 8 :(得分:64)

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

示例:

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

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

答案 9 :(得分:57)

如果您使用Jackson作为JSON解析器,则启用它以允许注释:

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

然后你可以得到这样的评论:

{
  key: "value" // Comment
}

您还可以通过设置:

#开头的评论
mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

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

答案 10 :(得分:56)

评论不是官方标准。虽然一些解析器支持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

答案 11 :(得分:46)

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

答案 12 :(得分:42)

抱歉,我们无法在JSON中使用评论...请参阅JSON.org上的JSON语法图。

Douglas Crockford说“why he removed comments in JSON and providing an alternative way to do that”:

  

我从JSON中删除了评论,因为我看到有人使用它们   持有解析指令,这种做法本来就会被破坏   互操作性。我知道缺乏评论会让一些人知道   伤心,但不应该。

     

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

答案 13 :(得分:38)

如果你的文本文件是一个JSON字符串,某个程序会读取它,在使用它之前去除C或C ++样式注释有多难?

答案:这将是一个班轮。如果这样做,那么JSON文件可以用作配置文件。

答案 14 :(得分:34)

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

  

//" name":" string"

     

//" id":int

  

/ *这是

     

评论示例* /

PS:只有6个版本的Newtonsoft Json支持单行注释。

对于无法开箱即用的人的补充说明:我在我制作的ASP.NET Web应用程序中使用JSON格式进行基本设置。我读取文件,使用Newtonsoft库将其转换为设置对象,并在必要时使用它。

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

我认为这更容易使用/理解'而不是创建单独的设置.README'提交并解释其中的设置。

如果您对此类用法有疑问;对不起,精灵已经没了灯。人们会发现JSON格式的其他用法,你无能为力。

答案 15 :(得分:30)

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

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

所有这一切,并不意味着JSON文件应该包含传统意义上的注释。它应该只是数据。

请查看JSON website以获取更多详细信息。

答案 16 :(得分:29)

我刚刚遇到配置文件。我不想使用 XML (详细,图形,丑陋,难以阅读)或“ini”格式(没有层次结构,没有真正的标准等)或Java“属性”格式(像.ini)。

JSON可以做他们能做的所有事情,但它更简洁,更易于阅读 - 解析器在许多语言中都很容易和普遍存在。它只是一个数据树。但是,带外注释通常是记录“默认”配置等的必要条件。配置永远不是“完整文档”,而是保存数据的树,在需要时可以是人类可读的。

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

答案 17 :(得分:28)

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

请参阅another Stack Overflow question

答案 18 :(得分:27)

JSON本身不支持注释,但您可以创建自己的解码器或至少预处理器来删除注释,这非常好(只要您忽略注释并且不使用它们来指导应用程序应该如何处理JSON数据)。

  

JSON没有评论。 JSON编码器绝不能输出注释。   JSON解码器可以接受并忽略注释。

     

永远不应该使用注释来传输任何有意义的内容。那是   JSON的用途是什么。

Cf:Douglas Crockford, author of JSON spec

答案 19 :(得分:25)

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

如果人们有充分理由反对在传递数据时使用JSON进行评论(无论是否有效),那么JSON可能会被分成两部分:

  • JSON-COM:有线的JSON,或者在传递JSON数据时适用的规则。
  • JSON-DOC:JSON文档,或文件或本地JSON。定义有效JSON文档的规则。

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

关于道格拉斯·克罗克福德在这个问题上提出的remark(由@Artur Czajka引用)

  

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

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

确定JSON特定的缩小可以用任何语言实现, 但是标准化这使它在所有语言和平台的解析器中变得无处不在,所以人们不再浪费他们的时间缺乏这个功能,因为他们有很好的用例,在网上论坛上查找问题,让人们告诉他们这是一个坏主意或建议从文本文件中删除注释很容易。

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

答案 20 :(得分:22)

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

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

在选择最终选项之前尝试使用备用数据结构(甚至数据列表)时,这会很有用。

答案 21 :(得分:18)

可以JSONP中有评论,但在纯JSON中没有。我花了一个小时试图让我的程序与Highcharts中的这个例子一起工作:http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

如果您点击该链接,您会看到

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

由于我的本地文件夹中有一个类似的文件,Same-origin policy没有问题,所以我决定使用纯JSON ......当然,$.getJSON无声地失败,因为评论。

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

答案 22 :(得分:18)

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

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

答案 23 :(得分:17)

这是一个"你可以" 的问题。这是"是" 答案。

不,您不应该使用重复的对象成员将侧信道数据填充到JSON编码中。 (参见"对象中的名称应该是唯一的" in the RFC)。

是的,你可以insert comments around the JSON,你可以解析。

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

* RFC只声明"在六个结构字符中的任何一个之前或之后允许空格",没有明确提到字符串,数字," false& #34;," true"," null"。在所有实现中都忽略了这个省略。


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

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

然后用二进制编码你的评论:

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

然后steg你的二进制文件:

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

这是你的输出:

$jsonWithComment = $steg . $jsonMin;

答案 24 :(得分:16)

JSON用于支持评论,但它们被滥用并从标准中删除。

来自JSON的创建者:

  

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

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

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

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

这个唯一需要的注释可能是" //这些是DAG标签"。关键名称可以根据需要提供信息。

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

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

答案 25 :(得分:12)

我们正在为项目使用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'}

答案 26 :(得分:12)

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

{

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

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

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

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

}

答案 27 :(得分:11)

有一个很好的解决方案(hack),它是有效的JSON。 只需两次(或更多)相同的密钥。例如:

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

所以JSON会理解为:

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

答案 28 :(得分:10)

JSON的作者希望我们在JSON中包含注释,但在解析它们之前将它们删除(参见Michael Burr提供的link)。如果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));

答案 29 :(得分:9)

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

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

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

请确保您的“notex”名称与任何真实字段不冲突。

答案 30 :(得分:8)

如果您将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-decommentgrunt-decomment

答案 31 :(得分:8)

JSON本身不允许评论。推理完全是愚蠢的,因为您可以使用JSON 本身创建注释,从而完全避免了推理,并且 毫无理由地加载解析器数据空间,对于<完全相同的结果和潜在的问题,例如:带有注释的JSON文件。

  

如果您尝试放入注释(例如使用///* */#),则某些解析器将失败,因为严格来说这不会   在JSON规范中。因此,您应该从不这样做。

例如,在这里,我的image manipulation system保存了图像符号和一些与它们有关的基本格式化(注释)信息(在底部):

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

答案 32 :(得分:7)

我刚发现“grunt-strip-json-comments”。

  

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

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

答案 33 :(得分:7)

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

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

Enter image description here

答案 34 :(得分:5)

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

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

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

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

答案 35 :(得分:5)

2019年VSCode用户的实际答案是使用'jsonc'扩展名。

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

如果VSCode和其他编辑器也添加对'json5'的本机支持,那就太好了,但是现在VSCode仅包含对'jsonc'的支持。

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

答案 36 :(得分:5)

免责声明:这很愚蠢

实际上,有一种添加注释并保持在规范内的方法(无需其他解析器)。但是,如果不进行任何形式的解析,它将不会导致人类可读的注释。

您可能会滥用以下内容:

  

在任何令牌之前或之后都可以使用无关紧要的空格。   空格是以下一个或多个代码的任何序列   点数:字符列表(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中的{hello base three)但是用0代替空格,用1使用换行,用2使用回车。

这只会给您留下很多不可读的空格(除非您制作一个IDE插件来对其进行实时编码/解码)。

出于明显的原因,我什至从未尝试过此操作,

答案 37 :(得分:5)

,新标准JSON5允许在许多other extensions中使用C ++样式的注释:

// A single line comment.

/* A multi-
   line comment. */

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

已经有npm packagePython packageJava packageC library可用。它是向后兼容的。我认为没有理由坚持“正式的” JSON限制。

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

答案 38 :(得分:5)

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

答案 39 :(得分:3)

是的,您可以发表评论。但我不会推荐上述任何理由。

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

答案 40 :(得分:3)

如果您使用的是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;
   }

希望这有帮助!

答案 41 :(得分:3)

正如许多答案已经指出的那样,JSON原本没有评论。当然有时候你还是想要它们。对于 Python ,有两种方法可以使用commentjson(仅适用于Python 2的#//)或json_tricks({{1} }或#用于Python 2和Python 3),它具有其他一些功能。免责声明:我制作了//

答案 42 :(得分:2)

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

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

答案 43 :(得分:2)

JSON 不支持注释,但 YAML 支持内联注释(虽然没有块注释)。由于它们都是数据文件并且具有相似的功能,因此这可能是要走的路。另外,网上还有json2yaml.com这样的资源,可以很方便的把JSON转YAML

答案 44 :(得分:2)

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

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

PHP

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

JavaScript

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

答案 45 :(得分:1)

确定您可以注释JSON。要从javascript中读取带注释的JSON文件,您可以在解析之前剥离注释(请参见下面的代码)。我确定可以改进此代码,但是对于那些使用regexp的人来说很容易理解。

我使用注释的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.
});

答案 46 :(得分:1)

您可以使用JSON-LDschema.org comment类型正确撰写评论:

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

答案 47 :(得分:1)

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

一个值得注意的例子是"Hashcorp Language" (HCL)"。它由制作流浪者,包装工,领事和金库的人编写。

答案 48 :(得分:0)

我在当前项目中遇到了这个问题,因为我有很多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] == "//":
      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
}
"""))

答案 49 :(得分:0)

整个线程假设添加注释是对JSON所做的唯一改进。如果某人因为要用于序列化而不想在JSON中添加注释,则只需忽略注释即可。空格也是如此。但是为什么要停在那里?为什么在JSON中必需引号?他们没有添加任何有用的东西。

我认为JSON如此严格的唯一原因是解析困难。但事实并非如此。几乎任何程序员都可以沿任一方向编写JSON解析器。

我希望JSON可读且高效(简要),并且对数据传输,配置文件等有用。以下示例满足了这两个要求:

{stringA: stringB, stringC: stringD, [stringE, stringF]}

比任何现有的JSON规范都要短,但可读性和效率更高。

是否需要在属性或值中包含引号,撇号,逗号或括号?就像在JavaScript中一样,只需将它们括在问号或撇号中(使用反斜杠转义)即可。

但是请使引号为可选。为什么?因为JSON不能包含变量或函数名(以避免注入攻击),所以引号不会引起歧义。我们已经知道所有数据都是字符串。因此,请不要使用引号,除非确实需要它们。

答案 50 :(得分:0)

否,json无法直接包含注释。但是,根据this的建议,您可以通过执行类似的操作

来达到类似的效果
{
    "//name": "Name comment here",
    "name": "Jack",

    "//age": "Age comment here",
    "age": "25"
}

大多数json解析器将忽略未映射的属性。

答案 51 :(得分:0)

JSON Spec不支持评论// or /* */样式。

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

  1. json5
  2. VS Code

答案 52 :(得分:0)

否。

JSON都应该是数据,如果包含注释,那么它也将是数据。

不使用JSON中的注释

答案 53 :(得分:0)

是的。您可以将注释放入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中多次指定键,因此可以这样做。从语法上讲这是正确的,唯一的权衡是您在字典中将有一个带有垃圾值的空键(可以对其进行修剪...)

几年前,我看到了这个问题,但是我只是在我正在进行的一个项目中看到了这样的问题,我认为这是一种非常干净的方法。享受吧!

答案 54 :(得分:0)

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

答案 55 :(得分:0)

作为the inventor of JSON said

<块引用>

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

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

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

更重要的是,jq 可以像程序一样处理非常大的 JSON-with-comments 文件;这可以使用一个众所周知的 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

答案 56 :(得分:-1)

从技术上讲不是。但是您可以按照以下方法解决。

private fun countCharsV2(word: String): Map<Char, Int> {
    return word.chars()
        .mapToObj { it.toChar() }
        .collect(
            Collectors.toMap(
                Function.identity(),
                Function { 1 },
                BinaryOperator { a: Int, b: Int -> Integer.sum(a, b) }
            )
        )
}

只需将注释放入数据中即可。如果您对它们进行编号以使每个键路径都唯一,则应该没有问题。

答案 57 :(得分:-4)

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

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

它取代任何评论,例如:

/****
 * Hey
 */

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

它取代任何评论,例如:

// Hey

/\/\/.*/

在JavaScript中,您可以执行以下操作:

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