当手动生成JSON对象或数组时,通常更容易在对象或数组的最后一项上留下逗号。例如,从字符串数组输出的代码可能像这样(在c++中像伪代码):

s.append("[");
for (i = 0; i < 5; ++i) {
    s.appendF("\"%d\",", i);
}
s.append("]");

给你一个字符串

[0,1,2,3,4,5,]

这是允许的吗?


当前回答

简单,便宜,易于阅读,并且无论规格如何都能正常工作。

$delimiter = '';
for ....  {
    print $delimiter.$whatever
    $delimiter = ',';
}

对$delim的冗余赋值代价很小。 如果没有显式的循环,而是单独的代码片段,也同样有效。

其他回答

使用JSON5。不要使用JSON。

对象和数组可以以逗号结尾 如果对象键是有效的标识符,则可以不加引号 字符串可以使用单引号 字符串可以被分割成多行 数字可以是十六进制(以16为基数) 数字可以以小数点(前导或后导)开始或结束。 数字可以包括∞和-∞。 数字可以以显式的加号(+)开头。 内联(单行)和块(多行)注释都是允许的。

http://json5.org/

https://github.com/aseemk/json5

使用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

Using a trailing comma is not allowed for json. A solution I like, which you could do if you're not writing for an external recipient but for your own project, is to just strip (or replace by whitespace) the trailing comma on the receiving end before feeding it to the json parser. I do this for the trailing comma in the outermost json object. The convenient thing is then if you add an object at the end, you don't have to add a comma to the now second last object. This also makes for cleaner diffs if your config file is in a version control system, since it will only show the lines of the stuff you actually added.

    char* str = readFile("myConfig.json");
    char* chr = strrchr(str, '}') - 1;
    int i = 0;
    while( chr[i] == ' ' || chr[i] == '\n' ){
        i--;
    }
    if( chr[i] == ',' ) chr[i] = ' ';
    JsonParser parser;
    parser.parse(str);

根据类JSONArray规范:

一个额外的,(逗号)可以出现在右括号之前。 空值将被插入,(逗号)省略。

所以,根据我的理解,应该允许这样写:

[0,1,2,3,4,5,]

但是有些解析器可能会返回7作为项目计数(如Daniel Earwicker指出的IE8),而不是预期的6。


编辑:

我发现了这个JSON验证器,它根据RFC 4627 (JavaScript对象符号的应用程序/ JSON媒体类型)和JavaScript语言规范验证JSON字符串。实际上,这里带逗号的数组只对JavaScript有效,而对RFC 4627规范无效。

然而,在RFC 4627规范中指出:

2.3. 数组 数组结构用0周围的方括号表示 或更多的值(或元素)。元素之间用逗号分隔。 Array = begin-array [value *(value-separator value)

对我来说,这又是一个解释问题。如果您写的元素用逗号分隔(没有说明特殊情况,如最后一个元素),则可以从两种方式来理解。

P.S. RFC 4627不是一个标准(如明确声明的那样),并且已经被RFC 7159(这是一个提议的标准)废止了

如前所述,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("]");