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

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

那么JSON列表的元素呢? 他们的订单是否维持?

是的,JSON数组中元素的顺序被保留。 从RFC 7159 – JavaScript对象表示法(JSON)数据交换格式 (重点介绍):

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

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

术语“对象”和“数组”来自JavaScript的惯例。

数组中元素的顺序( [] )保持不变。 “对象”( {} )中的元素(名称:值对)的顺序不是,通常情况下,如果不是由JSON格式器/parsing器本身,然后由特定于语言的对象(如果不是) Dictionary,NSDictionary,Hashtable等),用作内部表示。

实际上,如果键的types是NaN,那么浏览器不会改变顺序。

以下脚本将输出“一”,“二”,“三”:

 var foo={"3":"Three", "1":"One", "2":"Two"}; for(bar in foo) { alert(foo[bar]); } 

而下面的脚本会输出“三”,“一”,“二”:

 var foo={"@3":"Three", "@1":"One", "@2":"Two"}; for(bar in foo) { alert(foo[bar]); } 

一些JavaScript引擎保持按键的顺序。 例如,V8 除了可以parsing为无符号的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引擎。

演示在这里和这里 。

“JSON列表中元素的顺序是否保持不变?” 这不是一个好问题。 你需要问“在执行JSON列表中元素的顺序是否保持?” 正如Felix King所指出的那样,JSON是一种文本数据格式。 没有理由,它不会变异。 不要将JSONstring与(JavaScript)对象混淆。

您可能正在讨论像JSON.stringify(JSON.parse(...)) 。 现在答案是:这取决于实施。 JSONparsing器的99%*不维护对象的顺序,并且保持数组的顺序,但是你也可以使用JSON来存储类似于

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

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

*可能更多:)