JSON列表中元素的顺序是否保留?

我注意到JSON对象中元素的顺序不是原来的顺序。

JSON列表的元素呢?他们的秩序维持了吗?

213416 次浏览

是的,JSON数组中元素的顺序保持不变。From RFC 7159 - JavaScript对象符号(JSON)数据交换格式 (强调我的):

对象是0个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串,number, 布尔值,空值,对象或数组

数组是由零个或多个值组成的命令序列。

“对象”;和“;array"来自的惯例 JavaScript。< / p >

一些实现也保留了JSON对象的顺序,但这并不能保证。

数组([])中元素的顺序被保持。在一个“对象”({})中元素的顺序(名称:值对)不是,它们通常是“混乱”的,如果不是由JSON格式化器/解析器本身,那么是由特定于语言的对象(Dictionary, NSDictionary, Hashtable等)用作内部表示。

“JSON列表中元素的顺序是否被维护?”不是一个好问题。你需要问“当执行[…]时,JSON列表中元素的顺序是否被维护?”] ?” 正如Felix King所指出的,JSON是一种文本数据格式。它不会无缘无故地变异。不要混淆JSON字符串和(JavaScript)对象

你可能在谈论像JSON.stringify(JSON.parse(...))这样的操作。现在的答案是:这取决于实现。99%*的JSON解析器不维护对象的顺序,但确实维护数组的顺序,但您也可以使用JSON存储类似的东西

{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}

使用一个解析器来维护对象的顺序。

*可能更多:)

一些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上,你会始终按照这个顺序得到猴子。Node.js也使用V8。即使你有成千上万的项目,这也适用。YMMV和其他JavaScript引擎。

演示在这里在这里

实际上,如果键的类型是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]);
}