当手动生成JSON对象或数组,它往往容易留下拖尾逗号上的对象或数组的最后一项。 例如,代码,以输出从一个字符串数组可能看起来像(在C ++等伪代码):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
给你喜欢的字符串
[0,1,2,3,4,5,]
这可以吗?
当手动生成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的结构是要始终追加一个逗号分隔每个条目后(如你在上面做的),然后添加在一个没有结尾的逗号结束虚拟条目另一个选择(但这只是懒惰; - >)。
不以阵列不幸很好地工作。
号的JSON规范,为维持在http://json.org ,不允许尾随逗号。 从我所看到的,有些解析器可能默默地让他们阅读JSON字符串时,而其他人将引发错误。 对于互操作性,你不应该包括它。
上面的代码可以被重组,要么增加阵列终止时删除尾随逗号或项目之前添加逗号,跳过,对于第一个。
操作简单,价格便宜,易于阅读,并始终工作,无论规格的。
$delimiter = '';
for .... {
print $delimiter.$whatever
$delimiter = ',';
}
冗余分配到$ DELIM是一个非常小的代价。 同样的作品一样好,如果没有明确的循环,但单独的代码片段。
尾随逗号是允许在JavaScript中,但不要在IE浏览器。 道格拉斯Crockford的versionless JSON规范并没有让他们,因为这是versionless这是不应该改变。 该ES5 JSON规范允许他们作为一个扩展,但Crockford的RFC 4627没有,ES5收归禁止他们。 Firefox的效仿。 互联网浏览器是为什么我们不能有好东西。
PHP程序员可能想看看破灭()。 这需要一个阵列连接起来使用字符串。
从文档 ...
$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
由于它已经说过,JSON规范(基于ECMAScript 3)不允许尾随逗号。 ES> = 5允许的话,这样你就可以实际使用纯JS该符号。 它被争论,有些解析器并支持它( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-不再视为接受/ ),但它的规格其实(如图所示http://json.org/ ),它不应该在JSON工作。 这件事说...
......我不知道为什么没有人指出,实际上你可以拆分在第0次迭代循环,使用领先的逗号,而不是尾随一个摆脱了比较代码的气味,并在回路中的任何实际的性能开销,导致这实际上更短,更简单,更快的代码(由于没有分支/在循环条件表达式)比其它解决方案建议。
例如,(在C风格的伪代码类似于OP提出的代码):
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("]");
有趣的是,C&C ++(我认为C#,但我不知道),明确允许后面的逗号 - 整整给出的理由是:它使programmaticly生成列表要容易得多。 不知道为什么的JavaScript并没有跟着他们走。
使用JSON5。 不要使用JSON。
http://json5.org/
https://github.com/aseemk/json5
根据类JSONArray规范 :
所以,按照我的理解,应该允许这样写:
[0,1,2,3,4,5,]
但它可能发生,有些解析器将返回7项数(如IE8丹尼尔·埃里克指出的)而不是预期的6。
编辑:
我发现这个JSON验证是验证对一个JSON字符串RFC 4627 (应用程序/ JSON媒体类型为JavaScript对象符号),并针对JavaScript语言规范。 其实这里有一个尾随逗号的数组被视为为RFC 4627规范有效的只是JavaScript和不。
然而,在RFC 4627规范指出:
2.3。 数组
阵列结构被表示为周围零级或更多的值(或多个元件)方括号中。 元件由逗号分隔。
array = begin-array [ value *( value-separator value ) ] end-array
对我来说,这又是一个解释的问题。 如果你写的元素之间用逗号隔开 (没有说明一些有关特殊情况下,如最后一个元素),它可以在这两个方面来理解。
PS RFC 4627是不是一个标准的(如明确规定),并已被RFC 7159(这是一个推荐标准)obsolited RFC 7159
从我过去的经验,我发现,不同的浏览器处理在不同的JSON尾随逗号。
Firefox和Chrome浏览器处理它就好了。 但IE(所有版本)似乎打破。 我的意思是真正打破并停止读剧本的其余部分。
牢记这一点,也是事实,它总是很高兴写兼容代码,我建议花费确保没有后面的逗号额外的努力。
:)
我保持当前计数,并把它比作一个总数。 如果当前计数小于总计数,我显示逗号。
如果你没有执行之前的JSON生成总数可能无法正常工作。
再说,如果你使用PHP 5.2.0或更高,你可以使用格式化内置JSON API使用你的回应。
我通常在阵列上环和字符串中的每个条目后附加一个逗号。 循环后,我再次删除最后一个逗号。
也许不是最好的方式,但不是检查每一次,如果是在循环我猜的最后一个对象更便宜。
这是不建议,但你仍然可以做这样的事情来分析它。
jsonStr = '[0,1,2,3,4,5,]'; let data; eval('data = ' + jsonStr); console.log(data)
以轻松JSON,你可以有尾随逗号, 或者只是离开了逗号 。 它们是可选的。
没有任何理由可言逗号需要存在于分析JSON文件一样。
看看在轻松JSON规范,你会看到原来的JSON规范如何“吵”的。 太多的逗号和报价...
http://www.relaxedjson.org
你也可以尝试一下你的榜样使用这个在线RJSON解析器和看到它得到正确的解析。
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
有一种可能的方式,以避免在回路中,如果分支。
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