我注意到JSON对象中的元素顺序不是原始顺序。
JSON列表的元素怎么样?他们的订单是否保持不变?
答案 0 :(得分:305)
是的,保留了JSON数组中元素的顺序。来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (强调我的):
对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串,数字, boolean,null,object或array。
数组是零个或多个值的有序序列。
术语“对象”和“数组”来自于惯例 的JavaScript。
答案 1 :(得分:58)
维护数组([]
)中元素的顺序。 “对象”({}
)中元素的顺序(名称:值对)不是,并且它们通常是“混乱”,如果不是由JSON格式化程序/解析器本身,那么通过语言 - 特定对象(Dictionary,NSDictionary,Hashtable等),用作内部表示。
答案 2 :(得分:8)
实际上,如果密钥是NaN类型,浏览器将不会更改订单。
以下脚本将输出“One”,“Two”,“Three”:
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]);
}
答案 3 :(得分:5)
某些JavaScript引擎会将密钥保持在插入顺序中。例如,V8 keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers。
这意味着如果您运行以下任一项:
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引擎。
答案 4 :(得分:3)
“是否维护了JSON列表中元素的顺序?”这不是一个好问题。您需要询问“在执行[...]时是否保留了JSON列表中元素的顺序?” 正如Felix King所指出的,JSON是一种文本数据格式。没有理由它不会变异。不要将JSON字符串与(JavaScript)对象混淆。
你可能在谈论像JSON.stringify(JSON.parse(...))
这样的行动。现在答案是:这取决于实施。 99%*的JSON解析器不维护对象的顺序,并且保持数组的顺序,但您也可以使用JSON来存储类似
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
并使用维护对象顺序的解析器。
*可能更多:)