当手动生成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,]
这是允许的吗?
当前回答
使用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
其他回答
由于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
我保持当前的计数,并将其与总计数进行比较。如果当前计数小于总计数,则显示逗号。
如果在执行JSON生成之前没有总计数,则可能无法工作。
同样,如果您使用的是PHP 5.2.0或更高版本,则可以使用内置的JSON API格式化响应。
我不会参加辩论俱乐部,我会坚持防御性编程的原则,将两种简单的技术结合起来,以简化与他人的接口:
作为一个接收json数据的应用程序的开发者,我可以很轻松地允许后面有逗号。 当开发一个编写json的应用程序时,我会严格地使用其他答案的聪明技巧之一,只在项目之间添加逗号,并避免后面的逗号。
还有更大的问题需要解决……
尾随逗号在JavaScript中是允许的,但在IE中不允许。Douglas Crockford的无版本JSON规范不允许它们,因为它是无版本的,所以不应该改变。ES5 JSON规范允许它们作为扩展,但Crockford的RFC 4627不允许,ES5恢复为不允许。Firefox紧随其后。ie就是我们不能拥有美好事物的原因。
根据类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(这是一个提议的标准)废止了