Answers:
是的,JSON数组中元素的顺序得以保留。从RFC 7159开始-JavaScript对象表示法(JSON)数据交换格式 (重点是我的):
对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,null,对象或数组。
数组是零个或多个值的有序序列。
术语“对象”和“数组”来自JavaScript的约定。
一些实现也确实会保留JSON对象的顺序,但这不能保证。
实际上,如果键的类型为NaN,则浏览器将不会更改顺序。
以下脚本将输出“一个”,“两个”,“三个”:
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
而以下脚本将输出“ Three”,“ One”,“ Two”:
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
一些JavaScript引擎会按插入顺序保留键。例如,V8 将所有键保持插入顺序,但可以解析为无符号32位整数的键除外。
这意味着如果您运行以下任何一项:
var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
if (animals.hasOwnProperty(animal)) {
$('<li>').text(animal).appendTo('#animals');
}
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
$('<li>').text(animal).appendTo('#animals');
}
在使用V8的Chrome上,您将始终按此顺序获得dog,bear和monkey。Node.js也使用V8。即使您有成千上万的项目,这也适用。YMMV与其他JavaScript引擎。
“ JSON列表中的元素顺序是否得到维护?” 这不是一个好问题。您需要问“执行[...]时是否保持JSON列表中元素的顺序?” 正如Felix King指出的那样,JSON是一种文本数据格式。它不会无故变异。请勿将JSON字符串与(JavaScript)对象混淆。
您可能正在谈论像这样的操作JSON.stringify(JSON.parse(...))
。现在的答案是:它取决于实现。99%*的JSON解析器不维护对象的顺序,也不维护数组的顺序,但是您最好使用JSON来存储类似
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
并使用维护对象顺序的解析器。
*可能甚至更多:)