你可以在一个JSON对象使用尾随逗号?你可以在一个JSON对象使用尾随逗号?(Can you use

2019-05-08 21:48发布

当手动生成JSON对象或数组,它往往容易留下拖尾逗号上的对象或数组的最后一项。 例如,代码,以输出从一个字符串数组可能看起来像(在C ++等伪代码):

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

给你喜欢的字符串

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

这可以吗?

Answer 1:

不幸的是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的结构是要始终追加一个逗号分隔每个条目后(如你在上面做的),然后添加在一个没有结尾的逗号结束虚拟条目另一个选择(但这只是懒惰; - >)。

不以阵列不幸很好地工作。



Answer 2:

号的JSON规范,为维持在http://json.org ,不允许尾随逗号。 从我所看到的,有些解析器可能默默地让他们阅读JSON字符串时,而其他人将引发错误。 对于互操作性,你不应该包括它。

上面的代码可以被重组,要么增加阵列终止时删除尾随逗号或项目之前添加逗号,跳过,对于第一个。



Answer 3:

操作简单,价格便宜,易于阅读,并始终工作,无论规格的。

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

冗余分配到$ DELIM是一个非常小的代价。 同样的作品一样好,如果没有明确的循环,但单独的代码片段。



Answer 4:

尾随逗号是允许在JavaScript中,但不要在IE浏览器。 道格拉斯Crockford的versionless JSON规范并没有让他们,因为这是versionless这是不应该改变。 该ES5 JSON规范允许他们作为一个扩展,但Crockford的RFC 4627没有,ES5收归禁止他们。 Firefox的效仿。 互联网浏览器是为什么我们不能有好东西。



Answer 5:

PHP程序员可能想看看破灭()。 这需要一个阵列连接起来使用字符串。

从文档 ...

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


Answer 6:

由于它已经说过,JSON规范(基于ECMAScript 3)不允许尾随逗号。 ES> = 5允许的话,这样你就可以实际使用纯JS该符号。 它被争论,有些解析器支持它( http://bolinfest.com/essays/json.html , http://whereswalden.com/2010/09/08/spidermonkey-json-change-trailing-commas-不再视为接受/ ),但它的规格其实(如图所示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("]");


Answer 7:

有趣的是,C&C ++(我认为C#,但我不知道),明确允许后面的逗号 - 整整给出的理由是:它使programmaticly生成列表要容易得多。 不知道为什么的JavaScript并没有跟着他们走。



Answer 8:

使用JSON5。 不要使用JSON。

  • 对象和阵列可以具有尾随逗号
  • 对象键可如果他们是有效的标识符来加引号
  • 字符串可以用单引号
  • 字符串可以在多行被分割
  • 号可以是十六进制(基数16)
  • 号码可以开始或与(前导或尾随)小数点结束。
  • 数字可以包括无穷和负无穷。
  • 数字可以有一个明确的加号(+)开头。
  • 内联(单线)和块(多行)注释是允许的。

http://json5.org/

https://github.com/aseemk/json5



Answer 9:

根据类JSONArray规范 :

  • 额外的,(逗号)可能只是在右括号之前出现。
  • 当存在,(逗号)省音的空值将被插入。

所以,按照我的理解,应该允许这样写:

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

但它可能发生,有些解析器将返回7项数(如IE8丹尼尔·埃里克指出的)而不是预期的6。


编辑:

我发现这个JSON验证是验证对一个JSON字符串RFC 4627 (应用程序/ JSON媒体类型为JavaScript对象符号),并针对JavaScript语言规范。 其实这里有一个尾随逗号的数组被视为为RFC 4627规范有效的只是JavaScript和不。

然而,在RFC 4627规范指出:

2.3。 数组

阵列结构被表示为周围零级或更多的值(或多个元件)方括号中。 元件由逗号分隔。

 array = begin-array [ value *( value-separator value ) ] end-array 

对我来说,这又是一个解释的问题。 如果你写的元素之间用逗号隔开 (没有说明一些有关特殊情况下,如最后一个元素),它可以在这两个方面来理解。

PS RFC 4627是不是一个标准的(如明确规定),并已被RFC 7159(这是一个推荐标准)obsolited RFC 7159



Answer 10:

从我过去的经验,我发现,不同的浏览器处理在不同的JSON尾随逗号。

Firefox和Chrome浏览器处理它就好了。 但IE(所有版本)似乎打破。 我的意思是真正打破并停止读剧本的其余部分。

牢记这一点,也是事实,它总是很高兴写兼容代码,我建议花费确保没有后面的逗号额外的努力。

:)



Answer 11:

我保持当前计数,并把它比作一个总数。 如果当前计数小于总计数,我显示逗号。

如果你没有执行之前的JSON生成总数可能无法正常工作。

再说,如果你使用PHP 5.2.0或更高,你可以使用格式化内置JSON API使用你的回应。



Answer 12:

我通常在阵列上环和字符串中的每个条目后附加一个逗号。 循环后,我再次删除最后一个逗号。

也许不是最好的方式,但不是检查每一次,如果是在循环我猜的最后一个对象更便宜。



Answer 13:

这是不建议,但你仍然可以做这样的事情来分析它。

 jsonStr = '[0,1,2,3,4,5,]'; let data; eval('data = ' + jsonStr); console.log(data) 



Answer 14:

以轻松JSON,你可以有尾随逗号, 或者只是离开了逗号 。 它们是可选的。

没有任何理由可言逗号需要存在于分析JSON文件一样。

看看在轻松JSON规范,你会看到原来的JSON规范如何“吵”的。 太多的逗号和报价...

http://www.relaxedjson.org

你也可以尝试一下你的榜样使用这个在线RJSON解析器和看到它得到正确的解析。

http://www.relaxedjson.org/docs/converter.html?source=%5B0%2C1%2C2%2C3%2C4%2C5%2C%5D



Answer 15:

有一种可能的方式,以避免在回路中,如果分支。

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


Answer 16:

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


文章来源: Can you use a trailing comma in a JSON object?