我可以在JSON文件中使用注释吗?如果是这样,怎么办?
//comments
Sublime Text配置文件的特定用例是否可行,答案是肯定的(从版本2开始)。Sublime Text至少不会抱怨它,而它将{"__comment": ...}
在控制台中抱怨,因为它是意外字段。
我可以在JSON文件中使用注释吗?如果是这样,怎么办?
//comments
Sublime Text配置文件的特定用例是否可行,答案是肯定的(从版本2开始)。Sublime Text至少不会抱怨它,而它将{"__comment": ...}
在控制台中抱怨,因为它是意外字段。
Answers:
没有。
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"
}
}
}
}
}
"__comment":"comment text goes here...",
Accronym
和Abbrev
属性分别发表评论怎么办?我之前曾使用过这种模式,但由于不允许这样做而停止了使用。这是一个hack。也许如果我在前面加上一个属性名称__comment__
。那是“ __comment__Abbrev”,仍然是一个hack,但是让我对所有特征进行评论
否,格式为的注释//…
或/*…*/
JSON中不允许使用。该答案基于:
application/json
JavaScript对象符号(JSON)的媒体类型如果选择,请添加评论;在解析或传输之前,先用减法器将其剥离。
我刚刚发布了JSON.minify(),它从JSON块中删除了注释和空格,并使之成为可以解析的有效JSON。因此,您可以像这样使用它:
JSON.parse(JSON.minify(my_str));
当我发布它时,我什至遭到了人们的强烈反对,甚至连想法都没有。所以我决定写一篇关于为什么在JSON中有意义的博客文章。它包含JSON创建者的以下著名注释:
假设您正在使用JSON保留要注释的配置文件。继续并插入您喜欢的所有评论。然后,将其通过JSMin传递给JSON分析器。- 道格拉斯·克罗克福德(Douglas Crockford),2012年
希望这对那些不同意为什么JSON.minify()有用的人有所帮助。
根据设计,注释已从JSON中删除。
我从JSON中删除了注释,因为我看到人们正在使用它们保留解析指令,这种做法会破坏互操作性。我知道缺少评论会使某些人感到难过,但事实并非如此。
假设您正在使用JSON保留要注释的配置文件。继续并插入您喜欢的所有评论。然后将其通过JSMin传递给JSON解析器。
免责声明:您的保修无效
正如已经指出的那样,这种黑客利用了规范的实现。并非所有JSON解析器都会理解这种JSON。流解析器尤其会阻塞。
这是一个有趣的好奇心,但是您真的不应该将它用于任何用途。以下是原始答案。
我发现了一个小技巧,可让您在不影响解析或更改以任何方式表示的数据的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]
}
这意味着没有评论的痕迹,并且它们不会有怪异的副作用。
骇客入侵!
JSON不支持注释。也从未打算将其用于需要注释的配置文件。
Hjson是人类的配置文件格式。轻松的语法,更少的错误,更多的注释。
有关JavaScript,Java,Python,PHP,Rust,Go,Ruby和C#库的信息,请参见hjson.org。
考虑使用YAML。它几乎是JSON的超集(几乎所有有效的JSON都是有效的YAML),并且允许注释。
yaml
Python并未随附库。
注释不是官方标准,尽管某些解析器支持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的替代方法。
另一个选择是jsonc。
您应该改为编写JSON模式。JSON模式是当前提议的Internet草案规范。除了文档之外,该模式还可以用于验证JSON数据。
例:
{
"description":"A person",
"type":"object",
"properties":
{
"name":
{
"type":"string"
},
"age":
{
"type":"integer",
"maximum":125
}
}
}
您可以通过使用描述架构属性来提供文档。
这是我在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"
}
NO。JSON曾经支持注释,但是它们被滥用并从标准中删除。
来自JSON的创建者:
我从JSON中删除了注释,因为我看到人们正在使用它们保留解析指令,这种做法会破坏互操作性。我知道缺少评论会使某些人感到难过,但事实并非如此。- 道格拉斯·克罗克福德(Douglas Crockford),2012年
官方JSON网站位于JSON.org。JSON被ECMA International 定义为标准。总有一个请愿程序来修改标准。由于多种原因,注释不太可能被添加到JSON标准中。
通过设计,JSON是XML的一种易于反向工程(人工分析)的替代方案。甚至简化到不需要注释的地步。它甚至不是标记语言。目标是稳定和互操作性。
任何了解面向对象的“具有”关系的人都可以理解任何JSON结构-这就是重点。它只是带有节点标签(键/值对)的有向无环图(DAG),这是一种几乎通用的数据结构。
唯一需要的注释可能是“ //这些是DAG标签”。键名可以根据需要提供丰富的信息,从而允许任意语义上的统一。
任何平台都可以仅用几行代码来解析JSON。XML需要复杂的OO库,这些库在许多平台上都不可行。
注释只会使JSON的互操作性降低。除非您真正需要的是标记语言(XML),否则根本就没有其他要添加的内容,并且不关心持久性数据是否易于解析。
但作为JSON的创建者,也观察到,一直有JS管道支持注释:
继续并插入您喜欢的所有评论。然后,将其通过JSMin传递给JSON分析器。- 道格拉斯·克罗克福德(Douglas Crockford),2012年
如果您的文本文件(它是JSON字符串)将由某个程序读取,那么在使用它之前剥离C或C ++样式的注释会有多困难?
答:那将是一个班轮。如果这样做,则可以将JSON文件用作配置文件。
如果您将Newtonsoft.Json库与ASP.NET一起使用来读取/反序列化,则可以在JSON内容中使用注释:
//“ name”:“ string”
//“ id”:int
要么
/* 这是一个
评论示例* /
PS:单行注释仅在6+版本的Newtonsoft Json中受支持。
对于开箱即用的人的补充说明:想不开用的我将JSON格式用于我制作的ASP.NET Web应用程序中的基本设置。我阅读了文件,并使用Newtonsoft库将其转换为设置对象,并在必要时使用它。
我更喜欢在JSON文件本身中编写有关每个设置的注释,并且我真的不在乎JSON格式的完整性,只要我使用的库可以。
我认为这比创建单独的“ settings.README”文件并解释其中的设置“更易于使用/理解”。
如果您对这种用法有疑问;抱歉,精灵没电了。人们会发现JSON格式还有其他用法,您对此无能为力。
JSON背后的想法是提供应用程序之间的简单数据交换。这些通常是基于Web的,并且语言是JavaScript。
它实际上并不允许这样的注释,但是,尽管将数据显然需要解析代码特别地忽略或处理,但将注释作为数据中的名称/值对之一传递肯定会起作用。
综上所述,JSON文件不应该包含传统意义上的注释。它应该只是数据。
请访问JSON网站以获取更多详细信息。
我只是在配置文件中遇到此问题。我不想使用XML(冗长,图形化,丑陋,难以阅读)或“ ini”格式(无层次结构,没有真正的标准等)或Java“属性”格式(如.ini)。
JSON可以完成他们所能做的所有事情,但是它的冗长程度更低,更易被人阅读-并且解析器在许多语言中都很容易实现。这只是一棵数据树。但是带外注释通常是记录“默认”配置等的必要条件。配置绝不能是“完整文档”,而可以是需要时人类可读的保存数据树。
我猜一个人可以"#": "comment"
为“有效” JSON使用。
JSON本身不支持注释,但是您可以使用自己的解码器或至少预处理器来剥离注释,这非常好(只要您只是忽略注释并且不使用它们来指导您的应用程序应如何处理JSON数据)。
JSON没有评论。JSON编码器不得输出注释。JSON解码器可以接受和忽略注释。
注释绝不能用于传达任何有意义的内容。这就是JSON的目的。
JSON对于配置文件和其他本地用法非常有意义,因为它无处不在,并且比XML更简单。
如果人们有充分的理由反对在传递数据时在JSON中添加注释(无论是否有效),则可以将JSON分为两种:
JSON-DOC将允许注释,并且可能存在其他细微差别,例如处理空格。解析器可以轻松地从一种规格转换为另一种规格。
关于道格拉斯·克罗克福德(Douglas Crockford)在此问题上的评论(@Artur Czajka引用)
假设您正在使用JSON保留要注释的配置文件。继续并插入您喜欢的所有评论。然后将其通过JSMin传递给JSON解析器。
我们正在谈论一个通用的配置文件问题(跨语言/跨平台),而他正在使用JS特定实用程序进行回答!
确保特定于JSON的minify可以用任何语言实现,但要对此进行标准化,以使其在所有语言和平台的解析器中无处不在,因此人们不再浪费时间缺少该功能,因为他们有很好的用例,正在寻找问题所在。在线论坛,并让人们告诉他们这是一个坏主意,或者表明很容易实现从文本文件中剥离注释。
另一个问题是互操作性。假设您有一个库或API或任何与某些配置或数据文件相关联的子系统。并且可以从不同的语言访问该子系统。然后,您要告诉人们:顺便说一句,不要忘记在将JSON文件传递到解析器之前从JSON文件中删除注释!
Dojo Toolkit JavaScript工具箱(至少从1.4版开始)允许您在JSON中包含注释。注释可以是/* */
格式。Dojo Toolkit通过dojo.xhrGet()
调用使用JSON 。
其他JavaScript工具包可能会类似地工作。
在选择最终选项之前尝试使用备用数据结构(甚至数据列表)时,这可能会有所帮助。
dojo.xhrGet()
通过接受来隐式鼓励。
JSON不是框架协议。这是一种无语言格式。因此,未为JSON定义注释的格式。
正如许多人建议的那样,有一些技巧,例如重复键或_comment
您可以使用的特定键。由你决定。
您可以在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策略没有问题,因此我决定使用纯JSON ...,当然,$.getJSON
由于注释而导致失败。
最终,我只是向上面的地址发送了一个手动HTTP请求,并意识到内容类型是text/javascript
因为JSONP返回纯JavaScript。在这种情况下,允许注释。但是我的应用程序返回content-type application/json
,所以我不得不删除注释。
这是一个“可以”的问题。这是一个“是”答案。
不,您不应该使用重复的对象成员将旁通道数据填充到JSON编码中。(请参阅RFC中的 “对象内的名称应唯一”)。
但是,如果您想要一种将任意辅助数据插入和提取到有效JSON的方法,这是一个答案。我们利用JSON编码中数据的非唯一表示形式。这是允许的*在“空白之前或之后任何六个结构特征允许”下的RFC的第二节。
* RFC仅声明“在六个结构字符中的任何一个之前或之后允许空白”,没有明确提及字符串,数字,“ false”,“ true”和“ null”。在所有实现中都会忽略此遗漏。
首先,通过缩小规范化JSON:
$jsonMin = json_encode(json_decode($json));
然后将您的评论编码为二进制:
$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);
然后隐藏您的二进制文件:
$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);
这是您的输出:
$jsonWithComment = $steg . $jsonMin;
免责声明:这很傻
实际上,有一种添加注释并保持在规范内的方法(无需其他解析器)。但是,如果不进行任何形式的解析,它将不会导致人类可读的注释。
您可能会滥用以下内容:
在任何令牌之前或之后都可以使用无关紧要的空格。空格是以下一个或多个代码点的任意序列:字符列表(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
(hello base three
以ASCII表示),而不是0使用空格,对于1使用换行,对于2使用回车。
这只会给您留下很多不可读的空格(除非您制作一个IDE插件来对其进行实时编码/解码)。
由于明显的原因,我什至从未尝试过,您也不应该尝试。
我们正在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'}
json
当包含这些适当注释时,不再是有效的JSON。
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."
}
}
要将JSON项目切成几部分,请添加“虚拟评论”行:
{
"#############################" : "Part1",
"data1" : "value1",
"data2" : "value2",
"#############################" : "Part2",
"data4" : "value3",
"data3" : "value4"
}
{ "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." }
这样可以保持名称唯一,并允许您添加所需的任何字符串值。这仍然是一个难题,因为注释不应成为JSON的一部分。作为另一种选择,为什么不在JSON之前或之后添加注释,而不在其中添加注释呢?