首页 文章

可以在JSON中使用注释吗?

提问于
浏览
6102

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

30 回答

  • 26

    没有 .

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

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

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

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

  • 26

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

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

    我想可以使用 "#": "comment" ,用于"valid" JSON .

  • 43

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

    正如已经指出的那样,这个hack利用了规范的实现 . 并非所有JSON解析器都能理解这种JSON . 流式解析器尤其会窒息 .

    这是一个有趣的好奇心,但你 should really not be using it for anything at all . 以下是原始答案 .


    我发现了一个小的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]
    }
    

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

    快乐的黑客!

  • 37

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

    叹 . 为什么不添加字段,例如

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

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

  • 705

    Include comments if you choose; strip them out with a minifier before parsing or transmitting.

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

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

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

    假设您使用JSON来保留您想要注释的配置文件 . 继续,插入您喜欢的所有评论 . 然后通过JSMin将其传递给JSON解析器 . - 道格拉斯克罗克福德,2012年

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

  • 1608

    你可以快速浏览一下json.org的经验 .

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

  • 198

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

    你可以有评论在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 ,所以我不得不删除注释 .

  • 4296

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

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

    我从JSON中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性 . 我知道缺乏评论会让一些人感到悲伤,但事实并非如此 . 假设您使用JSON来保留要注释的配置文件 . 继续,插入您喜欢的所有评论 . 然后通过JSMin将其传递给JSON解析器 .

  • 391

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

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

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

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

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

  • 97

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

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

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

  • 54

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

    JSON没有评论 . JSON编码器不得输出注释 . JSON解码器可以接受和忽略注释 . 绝不应该使用注释来传输任何有意义的内容 . 这就是JSON的用途 .

    Cf:Douglas Crockford, author of JSON spec .

  • 51

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

    • http://www.json.org

    • RFC 4627:JavaScript对象表示法的 application/json 媒体类型(JSON)

    • RFC 7159 JavaScript对象表示法(JSON)数据交换格式 - 已淘汰:4627,7158

  • 39

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

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

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

    {
      key: "value" // Comment
    }
    

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

    mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);
    

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

  • 33

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

    //“name”:“string”//“id”:int

    要么

    / 这是一个评论示例 /

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

    Additional note for people who can't think out of the box: 我在我制作的ASP.NET Web应用程序中使用JSON格式进行基本设置 . 我读取文件,使用Newtonsoft库将其转换为设置对象,并在必要时使用它 .

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

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

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

  • 28

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


    JSON5 is a proposed extension to JSON 旨在使人们更容易手工编写和维护 . 它通过直接从ECMAScript 5添加一些最小语法功能来实现此目的 .

  • 27

    JSON is not a framed protocol . 它是一种无语言格式 . 因此,没有为JSON定义注释的格式 .

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

  • 20

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

  • 19

    JSON背后的想法是提供简单的数据交换申请之间 . 这些通常是基于Web的,语言是JavaScript .

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

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

    有关更多详细信息,请查看JSON website .

  • 17

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

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

    • JSON-COM:线上的JSON,或者在传递JSON数据时应用的规则 .

    • JSON-DOC:JSON文档,或文件或本地JSON . 定义有效JSON文档的规则 .

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

    关于Douglas Crockford在这个问题上提出的remark(由@Artur Czajka引用)

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

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

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

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

  • 17

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

    例:

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

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

  • 10

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

    another Stack Overflow question .

  • 8

    评论已从JSON中删除 .

    我从JSON中删除了注释,因为我看到人们使用它们来保存解析指令,这种做法会破坏互操作性 . 我知道缺乏评论会让一些人感到悲伤,但事实并非如此 . 假设您使用JSON来保留要注释的配置文件 . 继续,插入您喜欢的所有评论 . 然后通过JSMin将其传递给JSON解析器 .

    资料来源:Public statement by Douglas Crockford on G+

  • 23

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

  • 10

    这是一个 "can you" 问题 . 这是一个 "yes" 答案 .

    不,您不应该使用重复的对象成员将侧通道数据填充到JSON编码中 . (见"The names within an object SHOULD be unique" in the RFC) .

    是的,你可以insert comments around the JSON,你可以解析出来 .

    但是如果你想要一种方法来插入和提取任意的侧通道数据到一个有效的JSON,这是一个答案 . 我们利用JSON编码中非唯一的数据表示 . 允许*在"whitespace is allowed before or after any of the six structural characters"下的RFC的第二部分中 .

    • RFC仅声明“在六个结构字符中的任何一个之前或之后允许空白”,未明确提及字符串,数字,“false”,“true”和“null” . 在所有实现中都忽略了这种省略 .

    首先,通过缩小它来规范化您的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;
    
  • 11

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

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

    所以JSON会将其理解为:

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

相关问题