繁体   English   中英

可以在 JSON 中使用注释吗?

Can comments be used in JSON?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

57 个回复

不。

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 中不允许使用//…/*…*/形式的注释。 这个答案基于:

  • 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 解析器。 - 道格拉斯·克罗克福德,2012

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

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

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

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

资料来源: Douglas Crockford 在 G+ 上的公开声明

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

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

Hjson简介

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

免责声明:您的保修无效

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

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

快乐黑客!

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

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

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

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

以下是我在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 模式目前是一个提议的 Internet 草案规范。 除了文档之外,该模式还可用于验证您的 JSON 数据。

例子:

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

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

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

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

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

{
  key: "value" // Comment
}

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

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

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

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

来自 JSON 的创建者:

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

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

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

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

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

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

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

但是正如 JSON 的创建者也观察到的那样,JS 管道一直支持评论:

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

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

//“名称”:“字符串”

//"id": int

或者

/* 这是一个

评论示例 */

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

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

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

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

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

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

答:应该是单排。 如果你这样做,那么 JSON 文件可以用作配置文件。

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

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

永远不应该使用评论来传递任何有意义的东西。 这就是 JSON 的用途。

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

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

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

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

查看JSON 网站了解更多详细信息。

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

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

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

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

查看另一个 Stack Overflow 问题

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 文件中删除注释!

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

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


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

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

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

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

可以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]
]);

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

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

JSON 不是框架协议 它是一种无语言格式 所以评论的格式没有为 JSON 定义。

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

免责声明:这很愚蠢

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

您可能会滥用以下内容:

在任何标记之前或之后都允许使用无关紧要的空格。 空格是以下一个或多个代码点的任意序列:字符制表 (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 插件来动态编码/解码它)。

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

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

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

是的,您可以在 JSON周围插入注释,您可以解析出来。

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


首先,通过缩小 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;

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 输出之前使用注释进行调试。 所以我把调试信息放在HTTP 头中,避免破坏客户端:

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

在此处输入图像描述

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

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

{

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

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

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

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

}

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

如果将 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

叹。 为什么不只是添加字段,例如

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

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

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

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

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

喜欢:

  1. JSON5
  2. 视觉工作室代码
  3. 评论json

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

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

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

正如JSON 的发明者所说

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

实用程序包含一个允许“#”样式注释的解码器,因此 jq 是可以与 JSON-with-comments 文件结合使用的几种工具之一,只要这些文件被视为“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 length
216930

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

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

所以 JSON 会将其理解为:

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

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

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

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

(我在发布之前搜索了所有答案,没有提到'jsonc'。)

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

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

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

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

不,JSON 不能直接有注释。 但是,正如this建议的那样,您可以通过执行类似的操作来实现类似的效果

{
    "//name": "Name comment here",
    "name": "Jack",

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

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

纯粹的答案是否定的。

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

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

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

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

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

这样解析器可以找到所有注释并处理它们。

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

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

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

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

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

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

}

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

如果您使用的是 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-LDschema.org 注释类型来正确编写注释:

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

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

我能想到的 JSON 如此僵化的唯一原因是解析是否困难。 但事实并非如此。 几乎任何程序员都可以在任一方向编写 JSON 解析器。

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

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

比任何现有的 JSON 规范都短,但同样可读且更高效。

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

但请让引号可选。 为什么? 因为 JSON 不能包含变量或函数名称(以避免注入攻击),所以引号不提供任何歧义。 我们已经知道所有的数据都是字符串。 所以,请先省略引号,除非确实需要。

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

一个值得注意的例子是“Hashcorp 语言”(HCL) 。它是由制作 Vagrant、packer、consul 和 vault 的同一个人编写的。

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

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

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

JSON 不支持注释,但 YAML 支持内联注释(尽管没有块注释)。 由于它们都是数据文件并且具有相似的功能,因此这可能是要走的路。 另外,网上有json2yaml.com之类的资源,可以轻松将JSON转YAML

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

不,您不能在 JSON 中使用注释。 您最终可以在 JSON 对象中创建一个名为“评论”的字段,并在其中放置一条消息 :)。

技术上不是。 但您可以按如下方式解决。

{
  "json": "actual data goes here, comments below",
  "comment1": "Lorem ipsum dolor sit amet",
  "comment2": "consectetur adipiscing elit"
}

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

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

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

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

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

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

/****
 * Hey
 */

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

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

// Hey

/\/\/.*/

在 JavaScript 中,你可以这样做:

jsonString = jsonString.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/, "").replace(/\/\/.*/,"")
var object = JSON.parse(jsonString);
3 有没有一种方法可以使用JSON在Jira中添加内部注释?

我正在公司的Jira Service Desk项目上工作,我们的某些工作流程自动化遇到了一些麻烦。 当前,要从步骤1(等待支持)到工作步骤2(进行中)在工作流程中移动问题,请点击“进行中”按钮后,用户必须输入评论,才能将问题成功移至下一步。 此操作按预期工作,但我们也希望利用自动化规则, ...

4 我可以使用 annotate 在 django 中创建 Charfield 吗?

我正在使用一个名为 Account 的对象数据集,该数据集需要 go 通过注释来进行一些计算。 我有一个范围列表 [[0, 1], [2, 4], [5, 49], [50, 99]] 代表不同范围的员工。 我想做一个注释来分析 object 帐户是否属于某个范围,如果是,则创建一个名为“rang ...

5 在LaTeX中可以使用roxygen注释吗?

我有几个带有roxygen注释的功能,如下所示: 现在,我想以某种方式将生成的文档( .Rd )插入LaTeX文档中。 我的LaTeX编译器支持knitr ,但是我看不到任何将R文档格式转换为R markdown或.Rtex格式的方法。 是否可以将.Rd转换为knitr (或通常 ...

9 我可以使用注释来修改带注释的属性吗?

给定 是否可以在myPOJOObject.name内修改属性XssSanitizedAspect ? 实际上,我需要一种XSS清理String属性的方法。 我尝试创建自定义的Jackson解串器。 它起作用了,但是我无法注入功能切换 (没有解决方法会破坏与UI的所有约定),因此 ...

10 我可以使用ColumnDataSource中的数据在bokeh中绘制注释吗?

我想在我的散景图上画一条垂直线,在运行时通过浏览器中的javascript移动。 (这是一个在时间序列图上标记当前时间的时间栏。) 为了绘制静态垂直线,我使用了: 为了启用交互性,我认为我需要从ColumnDataSource获取location 。 但是,我无法弄清楚该怎么做 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM