Ben*_*bee 373 syntax json delimiter
手动生成JSON对象或数组时,通常更容易在对象或数组中的最后一项上留下尾随逗号.例如,从字符串数组输出的代码可能看起来像(在像C++这样的伪代码中):
s.append("[");
for (i = 0; i < 5; ++i) {
s.appendF("\"%d\",", i);
}
s.append("]");
Run Code Online (Sandbox Code Playgroud)
给你一个字符串
[0,1,2,3,4,5,]
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?
bri*_*anb 236
不幸的是,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("]");
Run Code Online (Sandbox Code Playgroud)
for循环中额外的一行代码并不昂贵......
我在从某个表单的字典输出结构到JSON时使用的另一个替代方法是在每个条目之后总是附加一个逗号(如上所述),然后在末尾添加一个没有尾随逗号的虚拟条目(但是那只是懒惰; - >).
不幸的是,对阵列不适用.
Ben*_*bee 128
不.在http://json.org上维护的JSON规范不允许使用尾随逗号.从我所看到的,一些解析器可能在读取JSON字符串时默默地允许它们,而其他解析器会抛出错误.对于互操作性,您不应包含它.
上面的代码可以重新构造,要么在添加数组终止符时删除尾随逗号,要么在项目之前添加逗号,跳过第一个代码.
小智 102
简单,便宜,易于阅读,无论规格如何,始终可以使用.
$delimiter = '';
for .... {
print $delimiter.$whatever
$delimiter = ',';
}
Run Code Online (Sandbox Code Playgroud)
$ delim的冗余分配是一个非常小的代价.如果没有显式循环但是单独的代码片段,也可以正常工作.
Rik*_*ood 14
PHP编码器可能想要检查implode().这需要一个数组使用字符串连接它.
来自文档 ......
$array = array('lastname', 'email', 'phone');
echo implode(",", $array); // lastname,email,phone
Run Code Online (Sandbox Code Playgroud)
vax*_*uis 13
正如已经说过的那样,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次迭代时拆分循环并使用前导逗号而不是尾随逗号来摆脱比较代码气味和循环中的任何实际性能开销,从而导致实际上比其他解决方案更短,更简单,更快(由于循环中没有分支/条件)的代码.
例如(在类似于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("]");
Run Code Online (Sandbox Code Playgroud)
Rol*_*and 12
与其加入辩论俱乐部,因为还有更大的问题需要解决,我会坚持Defensive Programming结合两种简单技术来简化与他人交流的原则:
作为接收json 数据的应用程序的开发人员,我会放松并允许尾随逗号。
在开发编写json的应用程序时,我会严格并使用其他答案的巧妙技术之一,仅在项目之间添加逗号并避免尾随逗号。
有趣的是,C&C++(我认为C#,但我不确定)特别允许尾随逗号 - 正是由于给出的原因:它使程序化生成列表变得更加容易.不确定为什么JavaScript没有跟随他们的领先优势.
使用JSON5。不要使用JSON。
https://github.com/aseemk/json5
| 归档时间: |
|
| 查看次数: |
95432 次 |
| 最近记录: |