Eli*_*Eli 5149
没有.
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"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
sta*_*ica 1775
不,表格的评论//…或/*…*/JSON中不允许.这个答案基于:
application/jsonJavaScript对象表示法的媒体类型(JSON)Kyl*_*son 773
如果您愿意,请附上评论; 在解析或传输之前用缩小器将它们剥离.
我刚刚发布了JSON.minify(),它从JSON块中删除了注释和空格,并使其成为可以解析的有效JSON.所以,您可以使用它:
JSON.parse(JSON.minify(my_str));
Run Code Online (Sandbox Code Playgroud)
当我发布它时,我得到了一个强烈反对的人甚至不同意它的想法,所以我决定写一篇关于为什么评论在JSON中有意义的综合博客文章.它包括来自JSON创建者的这个值得注意的评论:
假设您使用JSON来保留要注释的配置文件.继续,插入您喜欢的所有评论.然后通过JSMin将其传递给JSON解析器.- 道格拉斯·克罗克福德,2012年
希望这对那些不同意JSON.minify()可能有用的人有帮助.
Art*_*jka 422
评论已从JSON中删除.
我从JSON中删除了注释,因为我看到有人使用它们来保存解析指令,这种做法会破坏互操作性.我知道缺乏评论会让一些人感到悲伤,但事实并非如此.
假设您使用JSON来保留要注释的配置文件.继续,插入您喜欢的所有评论.然后通过JSMin将其传递给JSON解析器.
资料来源:Douglas Crockford对G +的公开声明
p3d*_*ola 201
免责声明:您的保修无效
正如已经指出的那样,这个hack利用了规范的实现.并非所有JSON解析器都能理解这种JSON.流式解析器尤其会窒息.
这是一个有趣的好奇心,但你真的不应该用它来做任何事情.以下是原始答案.
我发现了一个小小的hack,它允许你将注释放在一个不会影响解析的JSON文件中,或者以任何方式改变所表示的数据.
看来,在声明对象文字时,您可以使用相同的键指定两个值,最后一个优先.信不信由你,事实证明JSON解析器的工作方式相同.因此,我们可以使用它在源JSON中创建注释,这些注释不会出现在已解析的对象表示中.
({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length;
// => 1
Run Code Online (Sandbox Code Playgroud)
如果我们应用此技术,您的注释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]
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是有效的JSON.如果你解析它,你会得到一个像这样的对象:
{
"api_host": "hodorhodor.com",
"retry_interval": 10,
"auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
"favorite_numbers": [19,13,53]
}
Run Code Online (Sandbox Code Playgroud)
这意味着没有评论的痕迹,他们也不会有奇怪的副作用.
快乐的黑客!
lak*_*tak 170
JSON不支持评论.它也从未打算用于需要注释的配置文件.
Hjson是人类的配置文件格式.轻松的语法,更少的错误,更多的评论.
有关JavaScript,Java,Python,PHP,Rust,Go,Ruby和C#库的信息,请参阅hjson.org.
Mar*_*ser 116
考虑使用YAML.它几乎是JSON的超集(几乎所有有效的JSON都是有效的YAML)并且它允许注释.
raf*_*fel 66
您应该编写一个JSON模式.JSON模式目前是提议的Internet草案规范.除了文档之外,模式还可用于验证JSON数据.
例:
{
"description":"A person",
"type":"object",
"properties":
{
"name":
{
"type":"string"
},
"age":
{
"type":"integer",
"maximum":125
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用description schema属性提供文档.
And*_*ejs 60
如果您使用Jackson作为JSON解析器,那么这就是您启用它以允许注释的方式:
ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);
Run Code Online (Sandbox Code Playgroud)
然后你可以有这样的评论:
{
key: "value" // Comment
}
Run Code Online (Sandbox Code Playgroud)
您还可以#通过设置开始注释:
mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);
Run Code Online (Sandbox Code Playgroud)
但总的来说(如前所述)规范不允许发表评论.
sch*_*tbi 58
评论不是官方标准.虽然一些解析器支持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 }
}
Run Code Online (Sandbox Code Playgroud)
jsonlint不验证这一点.因此,注释是特定于解析器的扩展而非标准.
另一个解析器是JSON5.
JSON TOML的替代品.
man*_*ana 48
以下是我在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"
}
Run Code Online (Sandbox Code Playgroud)
小智 39
如果您的文本文件(即JSON字符串)将被某些程序读取,那么在使用之前删除C或C++样式注释有多难?
答:这将是一个班轮.如果您这样做,那么JSON文件可以用作配置文件.
dvd*_*dmn 34
如果您使用带有ASP.NET的Newtonsoft.Json库来读取/反序列化,则可以使用JSON内容中的注释:
//"name":"string"
//"id":int
要么
/*这是一个
评论示例*/
PS:只有6个以上版本的Newtonsoft Json支持单行注释.
对于那些无法开箱即用的人的补充说明:我在我制作的ASP.NET Web应用程序中使用JSON格式进行基本设置.我读取文件,使用Newtonsoft库将其转换为设置对象,并在必要时使用它.
我更喜欢在JSON文件本身中编写关于每个单独设置的注释,并且我真的不关心JSON格式的完整性,只要我使用的库可以正常使用它.
我认为这是一种"更易于使用/理解"的方式,而不是创建单独的"settings.README"文件并解释其中的设置.
如果您对此类用法有疑问; 对不起,精灵已经没了灯.人们会发现JSON格式的其他用法,你无能为力.
Nei*_*ock 30
JSON背后的想法是在应用程序之间提供简单的数据交换.这些通常是基于Web的,语言是JavaScript.
它实际上并不允许这样的注释,但是,将注释作为数据中的一个名称/值对传递肯定会起作用,尽管这些数据显然需要被解析代码忽略或处理.
总而言之,JSON文件不应该包含传统意义上的注释.它应该只是数据.
有关更多详细信息,请查看JSON网站.
pet*_*erk 29
我刚刚遇到配置文件.我不想使用XML(冗长,图形,丑陋,难以阅读)或"ini"格式(没有层次结构,没有真正的标准等)或Java"属性"格式(如.ini).
JSON可以做他们能做的所有事情,但它更简洁,更人性化 - 解析器在许多语言中都很容易和无处不在.它只是一个数据树.但是,带外注释通常是记录"默认"配置等的必要条件.配置永远不会是"完整文档",而是保存数据的树,在需要时可以是人类可读的.
我想可以使用"#": "comment""有效"JSON.
gab*_*ous 28
JSON本身不支持注释,但您可以创建自己的解码器或至少预处理器来删除注释,这非常好(只要您忽略注释并且不使用它们来指导应用程序应如何处理JSON数据).
JSON没有评论.JSON编码器绝不能输出注释.JSON解码器可以接受和忽略注释.
绝不应该使用注释来传输任何有意义的内容.这就是JSON的用途.
Cf:Douglas Crockford,JSON规范的作者.
Dom*_*ano 27
JSON用于支持评论,但它们被滥用并从标准中删除.
来自JSON的创建者:
我从JSON中删除了注释,因为我看到有人使用它们来保存解析指令,这种做法会破坏互操作性.我知道缺乏评论会让一些人感到悲伤,但事实并非如此.- 道格拉斯·克罗克福德,2012年
官方JSON站点位于JSON.org.JSON被ECMA International 定义为标准.总是有一个请愿程序来修改标准.由于多种原因,注释不太可能添加到JSON标准中.
JSON设计是一种易于反向设计(人工解析)的XML替代方案.甚至简化到注释是不必要的.它甚至不是标记语言.目标是稳定性和互操作性.
任何了解面向对象"has-a"关系的人都可以理解任何JSON结构 - 这就是重点.它只是一个带有节点标签(键/值对)的有向无环图(DAG),它是一种近乎通用的数据结构.
这个唯一的注释可能是"//这些是DAG标签".密钥名称可以根据需要提供信息.
任何平台都可以用几行代码解析JSON.XML需要复杂的OO库,这些库在许多平台上都不可行.
注释只会使JSON的互操作性降低.除非您真正需要的是标记语言(XML),否则无需添加任何其他内容,并且不关心是否可以轻松解析持久化数据.
Bas*_*ani 25
JSON对配置文件和其他本地用法很有意义,因为它无处不在,因为它比XML简单得多.
如果人们有充分的理由反对在传递数据时使用JSON进行评论(无论是否有效),那么可能JSON可以分为两部分:
JSON-DOC将允许注释,并且可能存在其他微小差异,例如处理空白.解析器可以轻松地从一个规范转换为另一个规范.
至于该言论道格拉斯克罗克福德在这个问题上取得了(由@Artur Czajka参考)
假设您使用JSON来保留要注释的配置文件.继续,插入您喜欢的所有评论.然后通过JSMin将其传递给JSON解析器.
我们正在讨论通用配置文件问题(跨语言/平台),他正在回答JS特定的实用程序!
当然,JSON特定的minify可以用任何语言实现,但是标准化,因此它在所有语言和平台的解析器中变得无处不在,所以人们不再浪费他们的时间缺乏这个功能,因为他们有很好的用例,看看问题在在线论坛,并让人们告诉他们这是一个坏主意或建议很容易实现从文本文件剥离评论.
另一个问题是互操作性.假设您有一个库或API或任何类型的子系统,其中包含一些与之关联的配置或数据文件.这个子系统可以从不同的语言访问.然后你去告诉别人:顺便说一下,在将它们传递给解析器之前不要忘记从JSON文件中删除注释!
Dav*_*vid 22
Dojo Toolkit JavaScript工具包(至少从版本1.4开始)允许您在JSON中包含注释.评论可以是/* */格式.Dojo Toolkit通过dojo.xhrGet()调用消耗JSON .
其他JavaScript工具包可能类似地工作.
在选择最终选项之前尝试使用备用数据结构(甚至数据列表)时,这会很有用.
h22*_*h22 22
是的,新标准JSON5允许 C++ 风格的注释,以及许多其他扩展:
// A single line comment.
/* A multi-
line comment. */
Run Code Online (Sandbox Code Playgroud)
JSON5 数据交换格式 (JSON5) 是 JSON 的超集,旨在减轻 JSON 的某些限制。它完全向后兼容,使用它可能比编写自定义非标准解析器、为现有解析器打开非标准功能或使用字符串字段等各种技巧进行注释更好。或者,如果使用的解析器支持,只需同意我们使用 JSON 5 子集,即 JSON 和 C++ 样式注释。这比我们以我们认为合适的方式调整 JSON 标准要好得多。
已经有npm 包、Python 包、Java 包和C 库可用。它向后兼容。我认为没有理由坚持“官方”JSON 限制。
我认为从 JSON 中删除注释的原因与在 Java 中删除运算符重载的原因相同:可以以错误的方式使用,但忽略了一些明显合法的用例。对于运算符重载,它是矩阵代数和复数。对于 JSON 注释,它是可以由人类编写、编辑或阅读的配置文件和其他文档,而不仅仅是解析器。
osa*_*osa 18
您可以在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]
]);
Run Code Online (Sandbox Code Playgroud)
由于我在本地文件夹中有一个类似的文件,因此同源策略没有问题,因此我决定使用纯JSON ......当然,$.getJSON由于注释而无法静默失败.
最后我只是向上面的地址发送了一个手动HTTP请求,并意识到内容类型是text/javascript,因此,JSONP返回纯JavaScript.在这种情况下,允许评论.但我的应用程序返回内容类型application/json,所以我不得不删除评论.
Wil*_*ken 17
这是一个"你可以"的问题.这是一个"是"的答案.
不,您不应该使用重复的对象成员将侧信道数据填充到JSON编码中.(参见RFC中的 "对象中的名称应该是唯一的" ).
但是如果你想要一种插入和提取任意侧通道数据到有效JSON的方法,这里是一个答案.我们利用JSON编码中的非唯一数据表示.在RFC的第二部分中允许*允许在"六个结构字符中的任何一个之前或之后允许空格".
* RFC仅声明"在六个结构字符中的任何一个之前或之后允许空白",未明确提及字符串,数字,"false","true"和"null".在所有实现中都忽略了这种省略.
首先,通过缩小它来规范化您的JSON:
$jsonMin = json_encode(json_decode($json));
Run Code Online (Sandbox Code Playgroud)
然后用二进制编码你的评论:
$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);
Run Code Online (Sandbox Code Playgroud)
然后steg你的二进制文件:
$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);
Run Code Online (Sandbox Code Playgroud)
这是你的输出:
$jsonWithComment = $steg . $jsonMin;
Run Code Online (Sandbox Code Playgroud)
Roy*_*ins 15
免责声明:这很傻
实际上,有一种添加注释并保持在规范内的方法(无需其他解析器)。但是,如果不进行任何形式的解析,它将不会导致人类可读的注释。
您可能会滥用以下内容:
在任何令牌之前或之后都可以使用无关紧要的空格。空格是以下一个或多个代码点的任意序列:字符列表(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
Run Code Online (Sandbox Code Playgroud)
(hello base three以ASCII表示),而不是0使用空格,对于1使用换行,对于2使用回车。
这只会给您留下很多不可读的空格(除非您制作一个IDE插件来对其进行动态编码/解码)。
由于明显的原因,我什至从未尝试过,您也不应该尝试。
Joy*_*Joy 12
我们正在使用strip-json-comments我们的项目.它支持以下内容:
/*
* Description
*/
{
// rainbows
"unicorn": /* ? */ "cake"
}
Run Code Online (Sandbox Code Playgroud)
只需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'}
Run Code Online (Sandbox Code Playgroud)
Chr*_*ris 11
要将JSON项目切割成部分,我添加"虚拟注释"行:
{
"#############################" : "Part1",
"data1" : "value1",
"data2" : "value2",
"#############################" : "Part2",
"data4" : "value3",
"data3" : "value4"
}
Run Code Online (Sandbox Code Playgroud)
fyn*_*yrz 11
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."
}
}
Run Code Online (Sandbox Code Playgroud)
EKa*_*ily 11
json 规范不支持注释,但您可以通过将注释写为键来解决问题,如下所示
{
"// my own comment goes here":"",
"key1":"value 1",
"// another comment goes here":"",
"key 2": "value 2 here"
}
Run Code Online (Sandbox Code Playgroud)
这样,我们使用注释文本作为键,确保(几乎)它们是唯一的,并且不会破坏任何解析器。如果您的某些评论不是唯一的,只需在末尾添加随机数字。
如果您需要解析注释以进行任何处理(例如剥离它们),您可以使用表明它是注释的文本填充注释值,如下所示:
{
"// my own comment goes here" : "_comment",
"key1":"value 1",
"// another comment goes here" : "_comment",
"key 2": "value 2 here"
}
Run Code Online (Sandbox Code Playgroud)
这样解析器就可以找到所有注释并处理它们。
Aur*_*mas 10
有一个很好的解决方案(hack),它是有效的JSON.只需两次(或更多)相同的密钥.例如:
{
"param" : "This is the comment place",
"param" : "This is value place",
}
Run Code Online (Sandbox Code Playgroud)
所以JSON会将其理解为:
{
"param" : "This is value place",
}
Run Code Online (Sandbox Code Playgroud)
pea*_*eak 10
正如JSON 的发明者所说:
JSON 没有注释。JSON 编码器不得输出注释。JSON 解码器可以接受和忽略注释。
实用程序jq包含一个允许“#”式注释的解码器,因此 jq 是可以与带有注释的 JSON 文件结合使用的几个工具之一,只要此类文件被视为“jq 程序”,而不是 JSON 文件。例如:
$ jq -ncf <(echo $'[1, # one\n2 ] # two')
[1,2]
Run Code Online (Sandbox Code Playgroud)
更重要的是,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
Run Code Online (Sandbox Code Playgroud)
JSON的作者希望我们在JSON中包含注释,但在解析它们之前将它们删除(参见Michael Burr提供的链接).如果JSON应该有注释,为什么不标准化它们,让JSON解析器完成这项工作呢?我不同意那里的逻辑,但是,唉,这是标准.使用其他人建议的YAML解决方案很好,但它需要库依赖.
如果你想删除注释,但又不想拥有库依赖,那么这是一个两行解决方案,适用于C++风格的注释,但可以适用于其他人:
var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));
Run Code Online (Sandbox Code Playgroud)
请注意,此解决方案只能用于您可以确保JSON数据不包含注释启动器的情况,例如('//').
另一种实现JSON解析,删除注释以及没有额外库的方法是在JavaScript解释器中评估JSON.当然,使用这种方法的警告是,您只想评估无污染的数据(没有不受信任的用户输入).这是Node.js中这种方法的一个例子 - 另一个警告,下面的例子只会读取一次数据,然后它将被缓存:
data = require(fs.realpathSync(doctree_fp));
Run Code Online (Sandbox Code Playgroud)
纯粹的答案是否定的。
但一些编辑器和平台使用变通方法向 JSON 添加注释。
1 . 如今,大多数编辑器都有内置选项和扩展来向 JSON 文档添加注释。(例如:- VS Code 也有一个带有注释的 JSON (jsonc) mode/ VS Code 也有很好的扩展)
2 . 有些平台提供内置的方式来添加评论(不纯的json)。(例如:- 在 firebase 中,我可以firebase.json毫无问题地评论一段时间。
{
"hosting": {
"headers": [
/*{
"source": "*.html",
"headers": [
{
"key": "Content-Security-Policy",
"value": "default-src 'self' ..."
}
]
},*/
]
}
}
Run Code Online (Sandbox Code Playgroud)
3 . 在你自己的JSON解析方法中,你可以设置一个预定义的键名作为注释。
例如:-
{
"comment" : "This is a comment",
"//" : "This also comment",
"name" : "This is a real value"
}
Run Code Online (Sandbox Code Playgroud)
如果将JSON加载为文本文件,则可以在其中使用带注释的JSON,然后从中删除注释.
您可以使用decomment库.以下是一个完整的例子.
输入JSON(文件input.js):
/*
* multi-line comments
**/
{
"value": 123 // one-line comment
}
Run Code Online (Sandbox Code Playgroud)
测试应用:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
输出:
{ value: 123 }
Run Code Online (Sandbox Code Playgroud)
另见:gulp-decomment,grunt-decomment
就我而言,我需要在JSON结构的输出之前使用注释进行调试。因此,我决定在HTTP标头中使用调试信息,以避免破坏客户端:
header("My-Json-Comment: Yes, I know it's a workaround ;-) ");
Run Code Online (Sandbox Code Playgroud)
我刚刚发现了" grunt-strip-json-comments ".
"从JSON中删除评论.它允许您在JSON文件中使用注释!"
{
// Rainbows
"unicorn": /* ? */ "cake"
}
Run Code Online (Sandbox Code Playgroud)
不,JSON 不能直接有注释。但是,正如this所建议的那样,您可以通过执行类似的操作来实现类似的效果
{
"//name": "Name comment here",
"name": "Jack",
"//age": "Age comment here",
"age": "25"
}
Run Code Online (Sandbox Code Playgroud)
大多数 JSON 解析器将忽略未映射的属性。
小智 6
叹.为什么不直接添加字段,例如
{
"note1" : "This demonstrates the provision of annotations within a JSON file",
"field1" : 12,
"field2" : "some text",
"note2" : "Add more annotations as necessary"
}
Run Code Online (Sandbox Code Playgroud)
只需确保您的"notex"名称不与任何真实字段冲突.
VSCode用户在2019年的实际答案是使用'jsonc'扩展名。
实用,因为这是VSCode识别的扩展,用于指示“带注释的JSON”。请在下面的评论中让我了解其他编辑器/ IDE。
如果VSCode和其他编辑器也添加对'json5'的本机支持,那就太好了,但是目前VSCode仅包括对'jsonc'的支持。
(我在发布此内容之前搜索了所有答案,但都没有提及“ jsonc”。)
小智 6
虽然 JSON 不支持注释,但JSONC支持。
使用“.jsonc”扩展名命名文件并使用jsonc解析器。
抱歉,如果这个答案太晚了。
jsonWithComments.jsonc
Run Code Online (Sandbox Code Playgroud)
例子:
jsonWithComments.jsonc
Run Code Online (Sandbox Code Playgroud)
如果这还不清楚,我认为这个机器人很奇怪。请在投票之前尝试一下这个问题,因为它没有帮助。
如果您的上下文是Node.js配置,则可以考虑通过JavaScript module.exports作为JSON的替代方案:
module.exports = {
"key": "value",
// And with comments!
"key2": "value2"
};
Run Code Online (Sandbox Code Playgroud)
该require语法仍然是相同的。作为JavaScript,文件扩展名应该为.js。
正如许多答案已经指出的那样,JSON 本身没有注释。当然,有时无论如何你都想要它们。对于Python,有两种方法可以使用commentjson(#和//仅适用于 Python 2)或json_tricks(#或//适用于 Python 2 和 Python 3),它具有其他几个功能。免责声明:我做了json_tricks。
您可以通过正则表达式使用简单的预处理。例如,以下函数将在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);
}
Run Code Online (Sandbox Code Playgroud)
它支持所有PHP样式的注释:/ *,#,//。字符串文字原样保留。
| 归档时间: |
|
| 查看次数: |
2026946 次 |
| 最近记录: |