在JSON中添加注释作为数据的既定方法是什么,可以经得起 "往返"?

问题描述 投票:-1回答:1

JSON规范不允许添加注释。然而,偶尔可能需要在JSON中插入注释。

在过去的十年(甚至更久)中,现有的建议包括使用一个特定的键,如 "//"来表示JSON字符串中的注释,例如。

{
  "//" : "To Do: Section 3, below, needs to be expanded"
  "Title" : "My Project Data with 4 sections"
}

传统的建议是包含一个构建步骤,删除所有... /* comments */ 在JSON字符串被处理之前,从JSON文件中提取注释(即把它变成一个有效的JSON字符串)。

这听起来是完全合理的,但这意味着任何注释都无法在从JSON到编程语言数据结构,然后再回到JSON的处理过程中存活。

有什么既定的或最佳实践的方法可以将注释作为数据添加到JSON中,并能经受住 "往返"?

json comments
1个回答
0
投票

这里的难题是如何找到一种方法来保存 评论为数据 对于 全程.

似乎所有已经存在的。评论-JSON 解决方案要么建议。

  • 增加 实话实说 贯穿于写作阶段,并在解析阶段之前将它们剥离出来。

  • 添加 评论为数据 在编写阶段,将它们留在那里,然后再处理由此产生的所有复杂问题和数据结构的脆弱性。

标准方法#1:引入一个预解析构建步骤,将真正的注释剥离出来。

一个常见的建议(包括Crockford自己的建议)是,在将JSON交给解析器之前,先将注释剥离出来作为构建步骤。

继续插入所有你喜欢的注释。

然后在把它交给JSON解析器之前,先用JSMin管好它。

来源:Douglas Crockford,4月30日 Douglas Crockford, 2012年4月30日

显然这不是什么好事,因为一旦注释被剥离出来,将无法重新构建并重新添加进去。


标准方法#2。注释即数据 在整个JSON中需要它们的地方。

如果去掉注释不是一种选择,那么或许可以将注释作为数据保留在整个JSON中,并随后在JSON被解析成的任何数据结构中持久存在?

这里的问题是,任何处理从JSON中解析出来的任何子结构的代码,现在都需要不断地、反复地检查该子结构是否是或是否包含一个 评论即数据 或不。

例如,如果一个包含 评论为数据 散落在各处的对象被解析成一个复杂的javascript对象,然后每次处理该对象时,每个

  • string
  • array element
  • object key-value entry

需要进行初步检查以确定它不是注释。

这样做会有很多乱七八糟的开销,而且会使JSON处理起来很脆弱,难以导出。


建议的解决方案。

除了上述两种方法之外,还有一种方法可以替代--那就是... 完全不在JSON中添加注释。 而且,反而。在结尾处保持一个单一的JSON有效的注释块。 (或JSON的开始)。这意味着注释将(尽可能地)在JSON的主体之外,但无论何时JSON被解析成数据结构,还是无论何时该数据结构被重新转换回JSON,它们都将被保留。

这就是诀窍。

这个... keys 在评论区中代表 地址.

每个地址都表明了JSON中相应注释的位置,如果它不包含在最后的块中的话。

A 定制的读者能理解这些地址。 并在JSON中所有正确的位置显示所有的注释。

每当保存JSON时,注释都会被保存在 从来没有 保存在其他地方,而不是保存在最后的注释块中。

任何非自定义编写的阅读器都无法执行这个技巧,但会在JSON的最后显示JSON有效的评论块。

例子:

一个实际的JSON,使用了这种方法。

{ 
  {
    "myArray" : [
      "Here is some data",
      "Here is some more data"
    ],

    "Example Key 1" : "Example Value 1",
    "Example Key 2" : "Example Value 2",
    "Example Key 3" : "Example Value 3",
    "Example Key 4" : "Example Value 4"
  },

  "finalData": "One last bit of data here"

  "// Comment_Block" : {
    "0000" : {"01" : "Everything which follows is an example of this approach"}
    "000100" : {"02" : "This comment is inside a nested serialised object"}
    "00010101" : {"03" : "Here is a comment inside a nested serialised array"}
    "000104" : {"04 Note to Andy" : "The keys below may not be used in the final version"}
    "0002" : {"05" : "One final comment"}
  }
}

当自定义编写的阅读器解析这个JSON文件时,它会显示以下JSON文件的 "虚构渲染"。

{
  "//01" : "Everything which follows is an example of this approach",

  {
    "//02" : "This comment is inside a nested serialised object",

    "myArray" : [
      "Here is some data",
      "//03 : Here is a comment inside a nested serialised array",
      "Here is some more data"
    ],

    "Example Key 1" : "Example Value 1",
    "Example Key 2" : "Example Value 2",
    "//04 Note to Andy" : "The keys below may not be used in the final version",
    "Example Key 3" : "Example Value 3",
    "Example Key 4" : "Example Value 4"
  },

  "//05" : "One final comment",
  "finalData": "One last bit of data here"
}

当JSON文件被编辑并保存在自定义编写的阅读器中时,阅读器会收集所有的评论条目,并在JSON文件末尾重建评论块,使用正确的地址作为键。


注释1.将所有的评论条目收集起来,并保存在自定义编写的阅读器中,并在JSON的最后使用正确的地址作为键重建评论块。

我觉得为了让评论在视觉上从JSON的其他部分中脱颖而出, 自定义的阅读器不能是一个...

<textarea></textarea>

而且,将需要一个

<div style="white-space: pre-wrap" contenteditable="true"></div>

这可能意味着一个痛苦的世界。(也可能不是)。

© www.soinside.com 2019 - 2024. All rights reserved.