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

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


当前回答

一些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]);
}

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

对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串,number, 布尔值、空值、对象或数组。 数组是由零个或多个值组成的有序序列。 术语“对象”和“数组”来自于 JavaScript。

一些实现也保留了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引擎。

这里和这里演示。