当手动生成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规范(基于ECMAScript 3)不允许尾随逗号。ES >= 5允许,所以你可以在纯JS中使用这个符号。这是有争议的,一些解析器确实支持它(http://bolinfest.com/essays/json.html, http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-no-longer-accepted/),但这是规范事实(如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("]");
其他回答
根据我过去的经验,我发现不同的浏览器对JSON中尾随逗号的处理方式不同。
Firefox和Chrome都处理得很好。但是IE(所有版本)似乎都坏了。我的意思是真正的中断,停止阅读剩余的剧本。
记住这一点,并且考虑到编写兼容的代码总是很好的事实,我建议花费额外的精力确保没有尾随逗号。
:)
我不会参加辩论俱乐部,我会坚持防御性编程的原则,将两种简单的技术结合起来,以简化与他人的接口:
作为一个接收json数据的应用程序的开发者,我可以很轻松地允许后面有逗号。 当开发一个编写json的应用程序时,我会严格地使用其他答案的聪明技巧之一,只在项目之间添加逗号,并避免后面的逗号。
还有更大的问题需要解决……
使用relax JSON,您可以使用后面的逗号,也可以不使用逗号。它们是可选的。
在解析类似json的文档时,完全没有必要使用逗号。
看一看relax JSON规范,你会发现原始JSON规范是多么“嘈杂”。太多的逗号和引号……
http://www.relaxedjson.org
您还可以使用这个在线RJSON解析器尝试您的示例,并查看它是否被正确解析。
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
String l = "[" + List<int>.generate(5, (i) => i + 1).join(",") + "]";
我保持当前的计数,并将其与总计数进行比较。如果当前计数小于总计数,则显示逗号。
如果在执行JSON生成之前没有总计数,则可能无法工作。
同样,如果您使用的是PHP 5.2.0或更高版本,则可以使用内置的JSON API格式化响应。