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 解决方案要么建议。
或
标准方法#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>
这可能意味着一个痛苦的世界。(也可能不是)。