手动生成JSON对象或数组时,通常在对象或数组的最后一项上留下逗号逗号会更容易。例如,从字符串数组输出的代码可能看起来像(在C ++中的伪代码中):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
给你一个像
[0,1,2,3,4,5,]
可以吗?
alert([1, 2, 3, ].length)
会显示“ 4”。
手动生成JSON对象或数组时,通常在对象或数组的最后一项上留下逗号逗号会更容易。例如,从字符串数组输出的代码可能看起来像(在C ++中的伪代码中):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
给你一个像
[0,1,2,3,4,5,]
可以吗?
alert([1, 2, 3, ].length)
会显示“ 4”。
Answers:
不幸的是,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只是为了避免该愚蠢的小逗号。关于昂贵的YMMV,请参见jsfiddle.net/oriadam/mywL9384。说明 :您的解决方案很棒,我讨厌讨厌用逗号结尾的规范。
不能。JSON规范(在http://json.org上维护)不允许尾随逗号。据我了解,某些解析器在读取JSON字符串时可能会默默地允许它们,而其他解析器则会抛出错误。为了实现互操作性,您不应将其包括在内。
上面的代码可以进行重组,以在添加数组终止符时删除结尾的逗号,或者在项目前添加逗号,而跳过第一个逗号。
简单,便宜,易于阅读,并且无论规格如何都可以正常工作。
$delimiter = '';
for .... {
print $delimiter.$whatever
$delimiter = ',';
}
$ delim的冗余分配要付出的代价很小。如果没有显式循环,但有单独的代码片段,则效果也一样。
if
比较容易掌握。但是感谢您的分享。
for(let ..., sep=""; ... ; sep=",") { ...
JavaScript中允许使用逗号结尾,但在IE中则不起作用。道格拉斯·克罗克福德(Douglas Crockford)的无版本JSON规范不允许使用它们,并且由于它是无版本的,因此不应更改。ES5 JSON规范允许将它们作为扩展,但Crockford的RFC 4627不允许,并且ES5恢复为不允许它们。Firefox也效仿。Internet Explorer是我们不能拥有美好事物的原因。
就像已经说过的那样,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次迭代时拆分循环并使用前导逗号而不是尾随一个来摆脱比较代码的味道和循环中任何实际的性能开销,从而导致比其他提出的解决方案实际上更短,更简单和更快的代码(由于循环中没有分支/条件)。
例如(采用类似于OP建议代码的C样式伪代码):
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("]");
PHP编码人员可能想签出implode()。这需要一个数组使用字符串将其连接起来。
从文档 ...
$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
有趣的是,C和C ++(以及我认为的C#,但我不确定)都明确允许尾随逗号-正是由于给出的原因:它使以编程方式生成列表更加容易。不确定为什么JavaScript没有遵循他们的领导。
使用JSON5。不要使用JSON。
因此,据我了解,应该允许这样写:
[0,1,2,3,4,5,]
但是有可能某些解析器将返回7作为项目计数(例如Daniel Earwicker指出的IE8)而不是预期的6。
编辑:
我发现此JSON验证程序可根据RFC 4627验证JSON字符串程序可(JavaScript对象表示法的application / json媒体类型)和JavaScript语言规范。实际上,在这里带有尾部逗号的数组仅对JavaScript有效,而对RFC 4627规范无效。
但是,在RFC 4627规范中声明:
2.3。数组
数组结构表示为包围零个或多个值(或元素)的方括号。元素用逗号分隔。
array = begin-array [ value *( value-separator value ) ] end-array
对我来说,这又是一个解释问题。如果您写元素用逗号分隔(没有说明特殊情况,例如最后一个元素),则可以用两种方式来理解它。
PS RFC 4627不是标准(明确声明),并且已被RFC 7159(这是提议的标准)所废止。RFC 7159
value-separator
没有value
权利。文字也很具体。“值分离”仅在存在多个值时适用。因此,如果两个值彼此相邻,则它们之间用逗号分隔。如果有一个值(或者只看最后的值),则没有分隔符,因此没有逗号。
使用Relaxed JSON,您可以使用尾部逗号,也可以只保留逗号。它们是可选的。
完全不需要使用逗号来解析类似JSON的文档。
看一下Relaxed JSON规范,您将看到原始JSON规范有多“嘈杂”。引号和引号太多了...
您也可以使用此在线RJSON解析器尝试您的示例,并查看它是否正确解析。
http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D
json object
using JSON.parse
,也可以将其解析为using RJSON.parse
。如果源是一个对象,我会同意你的观点,但事实并非如此。我看不出它在问题中提到downstream
了哪里消耗了对象或字符串。
由于使用了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