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器。
*可能更多:)