题
在手工产生的JSON对象或阵列,它往往更容易离开后的逗号上的最后一个项目的对象或阵列。例如,代码输出一系列的串可能看起来像(C++喜欢伪):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
给你一个字符串
[0,1,2,3,4,5,]
这是允许的?
解决方案
不幸的是, JSON规范不允许使用尾随逗号。有一些浏览器允许它,但通常你需要担心所有的浏览器。
一般情况下,我尝试解决问题,并在实际值之前添加逗号,因此您最终得到的代码如下所示:
s.append("[");
for (i = 0; i < 5; ++i) {
if (i) s.append(","); // add the comma only if this isn't the first entry
s.appendF("\"%d\"", i);
}
s.append("]");
for循环中额外的一行代码并不昂贵......
我在从某个表单的字典中输出结构到JSON时使用的另一个替代方法是在每个条目之后总是附加一个逗号(如上所述),然后在结尾处添加一个没有尾随的虚拟条目逗号(但这只是懒惰; - &gt;)。
不幸的是,对阵列不能正常工作。
其他提示
没有。在 http://json.org 上维护的JSON规范不允许使用尾随逗号。从我所看到的,一些解析器可能在读取JSON字符串时默默地允许它们,而其他解析器会抛出错误。对于互操作性,不应包含它。
上面的代码可以重新构建,在添加数组终结符时删除尾随的逗号,或者在项目之前添加逗号,跳过第一个代码。
简单,便宜,易于阅读,无论规格如何,它始终有效。
$delimiter = '';
for .... {
print $delimiter.$whatever
$delimiter = ',';
}
$ delim的冗余分配是一个非常小的代价。 如果没有显式循环但是单独的代码片段,也可以正常工作。
正如已经说过的那样,JSON规范(基于ECMAScript 3)不允许使用尾随逗号。 ES&gt; = 5允许它,因此您可以在纯JS中实际使用该表示法。有人争论过,一些解析器 支持它( http:// bolinfest。 com / essays / json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/ ),但这是规范事实(如< a href =“http://json.org/”rel =“noreferrer”> http://json.org/ )它不应该在JSON中工作。那件事说......
...我想知道为什么没有人指出你实际上可以在第0次迭代时拆分循环并使用前导逗号而不是尾随一个来摆脱比较代码的气味和循环中的任何实际性能开销,导致代码实际上比其他提出的解决方案更短,更简单,更快(由于循环中没有分支/条件)。
E.g。 (在类似于OP提议的代码的C风格伪代码中):
s.append("[");
// MAX == 5 here. if it's constant, you can inline it below and get rid of the comparison
if ( MAX > 0 ) {
s.appendF("\"%d\"", 0); // 0-th iteration
for( int i = 1; i < MAX; ++i ) {
s.appendF(",\"%d\"", i); // i-th iteration
}
}
s.append("]");
PHP编码员可能想要查看 implode()。这需要一个数组使用字符串连接起来。
来自文档 ......
$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
有趣的是,C&amp; C ++(我认为C#,但我不确定)专门允许尾随逗号 - 正是由于给出的原因:它使程序化生成列表变得更加容易。不确定为什么JavaScript没有跟随他们的领先优势。
使用JSON5.不要用手机中。
- 目的和阵可能有后的逗号
- 目钥匙可以引号如果他们是有效的标识符
- 串可以是单引述
- 串可分割的跨越多条线
- 数字可以进制(基16)
- 数字可以开始或结束(开头或结尾)小数点。
- 数字可能包括无限和无穷大。
- 数字可以开始一个明确的plus(+)的标志。
- 内联(single-line)和块(多线)的评论是不允许的。
根据 类JSONArray说明书:
- 一个额外的,(逗号)可能出现之前的闭架。
- 空值将插入当有,(逗号)省音.
因此,我的理解是,它应该被允许写入:
[0,1,2,3,4,5,]
但这可能发生的是,一些分析程序将返回7作为项目计数(如IE8作为丹尼尔Earwicker指出),而不是预期6.
编辑:
我发现这个 JSON验证程序 验证JSON串的反对 RFC4627 (应用程序/json媒体类型JavaScript对象符号)以及对JavaScript语言的规范。实际上这里一系列后的逗号被认为是有效的,只是为JavaScript和不RFC4627规范。
然而,在RFC4627规范是指出:
2.3.阵列
一系列的结构表示为方括号零 或多个数值(或元件)。元素是用逗号隔开。
array = begin-array [ value *( value-separator value ) ] end-array
对我来说这是又一个解释的问题。如果你写的 元素是用逗号分开 (没有说明一些有关特殊情况下,像最后一个元素),它可能被理解在这两个方面。
P.S.RFC4627不是一种标准(如明确说明),并且已经obsolited RFC7159(这是一个提议的标准) RFC7159
根据我过去的经验,我发现不同的浏览器以不同的方式处理JSON中的尾随逗号。
Firefox和Chrome都处理得很好。但IE(所有版本)似乎打破了。我的意思是真的打破并停止阅读剧本的其余部分。
牢记这一点,以及编写兼容代码总是很好的这一事实,我建议花费额外的努力来确保没有尾随逗号。
:)
我保留当前计数并将其与总计数进行比较。如果当前计数小于总计数,则显示逗号。
如果在执行JSON生成之前没有总计数,则可能无效。
然后,如果你使用PHP 5.2.0或更高版本,你可以使用内置的JSON API格式化你的响应。
使用Relaxed JSON,您可以使用逗号,或只留下逗号。它们是可选的。
没有理由需要存在逗号来解析类似JSON的文档。
看一下Relaxed JSON规范,您将看到原始JSON规范的“嘈杂”。太多的逗号和引号...
您也可以使用此在线RJSON解析器试用您的示例,并看到它被正确解析。
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
我通常遍历数组并在字符串中的每个条目后附加逗号。在循环之后,我再次删除最后一个逗号。
也许不是最好的方法,但是比每次检查更便宜,如果它是循环中的最后一个对象我猜。
不推荐,但您仍然可以执行此类操作来解析它。
jsonStr = '[0,1,2,3,4,5,]';
let data;
eval('data = ' + jsonStr);
console.log(data)
有一种方法可以避免循环中的if-branch。
s.append("[ "); // there is a space after the left bracket
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i); // always add comma
}
s.back() = ']'; // modify last comma (or the space) to right bracket
由于for循环用于迭代数组或类似的可迭代数据结构,我们可以使用数组的长度,如图所示,
awk -v header="FirstName,LastName,DOB" '
BEGIN {
FS = ",";
print("[");
columns = split(header, column_names, ",");
}
{ print(" {");
for (i = 1; i < columns; i++) {
printf(" \"%s\":\"%s\",\n", column_names[i], $(i));
}
printf(" \"%s\":\"%s\"\n", column_names[i], $(i));
print(" }");
}
END { print("]"); } ' datafile.txt
包含datafile.txt,
Angela,Baker,2010-05-23
Betty,Crockett,1990-12-07
David,Done,2003-10-31