json配置文件注释 - python json注释




可以在JSON中使用注释吗? (20)

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


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

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

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


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

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

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

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

至于该plus.google.com/118095276221607585885/posts/RK8qyGVaGSr道格拉斯克罗克福德在这个问题上取得了(由@Artur Czajka参考)

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

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

当然,JSON特定的minify可以用任何语言实现,但是标准化,因此它在所有语言和平台的解析器中变得无处不在,所以人们不再浪费他们的时间缺乏这个功能,因为他们有很好的用例,查看问题在线论坛,并让人们告诉他们这是一个坏主意或建议很容易实现从文本文件剥离评论。

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


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

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

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

有关更多详细信息,请查看JSON网站


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

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


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

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

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

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

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

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


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

免责声明:您的保修是无效的

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

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

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

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

快乐的黑客!


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

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

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

{
  key: "value" // Comment
}

您也可以通过设置以#开头的评论:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

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


如果您的文本文件(即JSON字符串)将被某些程序读取,那么在使用之前删除C或C ++样式注释有多难?

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


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

例:

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

您可以使用description schema属性提供文档。


抱歉,我们无法在JSON中使用注释...请参阅JSON.org JSON语法图。

Douglas Crockford说“ plus.google.com/118095276221607585885/posts/RK8qyGVaGSr ”:

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

假设您使用JSON来保留要注释的配置文件。 继续,插入您喜欢的所有评论。 然后通过JSMin将其传递给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项目切割成部分,我添加“虚拟注释”行:

{

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

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

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

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

}

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


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

请参阅另一个问题 。


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

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

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


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

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

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

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


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

JSON5是JSON的建议扩展,旨在使人们更容易手动编写和维护。它通过直接从ECMAScript 5添加一些最小语法功能来实现此目的。


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

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

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

所以JSON会将其理解为:

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






comments