当手动生成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的冗余赋值代价很小。 如果没有显式的循环,而是单独的代码片段,也同样有效。

其他回答

如上所述,这是不允许的。但在JavaScript中,这是:

var a = Array()
for(let i=1; i<=5; i++) {
    a.push(i)
}
var s = "[" + a.join(",") + "]"

(在Firefox, Chrome, Edge, IE11中工作良好,并且在IE9, 8,7,5中没有let)

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

从医生那里…

$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone

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

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

有一种可能的方法可以避免循环中的if分支。

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