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


254

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

JSON列表的元素呢?他们的订单得到维护吗?

Answers:


370

是的,JSON数组中元素的顺序得以保留。从RFC 7159开始-JavaScript对象表示法(JSON)数据交换格式 (重点是我的):

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

数组是零个或多个值的有序序列。

术语“对象”和“数组”来自JavaScript的约定。

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


但是,我已经与一些开发人员进行了交谈,这些开发人员遇到了不按数组排序的问题。看看ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf中这个措辞奇怪的段落 'JSON语法没有定义值顺序的任何特定含义。但是,JSON数组结构通常用于排序具有某些语义的情况。'
卡托

73

[]保持数组()中元素的顺序。{}并非“对象”()中元素(名称:值对)的顺序,通常是将它们弄乱,如果不是通过JSON格式化程序/解析器本身,则不是通过语言特定的对象(字典, NSDictionary,Hashtable等)用作内部表示。


7

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

16
但这依赖于JSON的未定义行为。您与之交换的任何东西可能都不会具有相同的行为。
热门点击

3
这个答案讨论了一个对象。这个问题与json“列表”有关,它只能推断为均值数组,它由json规范在语义上排序(请参阅Jeremy的答案)。
汤姆(Tom)

5

一些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上,您将始终按此顺序获得dogbearmonkey。Node.js也使用V8。即使您有成千上万的项目,这也适用。YMMV与其他JavaScript引擎。

演示这里这里


7
但这依赖于JSON的未定义行为。您与之交换的任何东西可能都不会具有相同的行为。
热门点击2013年

1

“ JSON列表中的元素顺序是否得到维护?” 这不是一个好问题。您需要问“执行[...]时是否保持JSON列表中元素的顺序?” 正如Felix King指出的那样,JSON是一种文本数据格式。它不会无故变异。请勿将JSON字符串与(JavaScript)对象混淆。

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

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

并使用维护对象顺序的解析器。

*可能甚至更多:)


1
是错误的,至少在谈论JSON解析器用法时如此。V8保持顺序,我的猜测是仅此一项就占JSON解析器使用量的1%以上。code.google.com/p/v8/issues/detail?id=164#c1
本杰明·阿特金

3
@BenAtkin有趣的是,您的链接指向有关V8如何维持顺序的说明。
user123444555621 2012年

2
“事实上的标准是匹配插入顺序,V8也是如此,但有一个例外”
Benjamin Atkin 2012年

14
所有人类都是男性,但有一个例外:女性是女性。
user123444555621 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.