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

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

给你一个字符串

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

这是允许的吗?


当前回答

不。https://json.org中的“铁路图”是规范的精确翻译,并明确表示a,总是在值之前,而不是直接在值之前]:

或}:

其他回答

根据类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规范不允许后面有逗号。有一些浏览器允许这样做,但通常需要考虑所有浏览器。

一般来说,我试图把问题转过来,在实际值之前添加逗号,所以你最终得到的代码看起来像这样:

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时,我使用的另一种替代方法是始终在每个条目后面附加一个逗号(正如您上面所做的那样),然后在末尾添加一个没有逗号的虚拟条目(但这只是懒惰;->)。

不幸的是,它不能很好地使用数组。

由于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

PHP程序员可能需要检查implode()。它接受一个数组,使用字符串将其连接起来。

从医生那里…

$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-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("]");