我注意到JSON对象中元素的顺序不是原来的顺序。
JSON列表的元素呢?他们的秩序维持了吗?
是的,JSON数组中元素的顺序保持不变。From RFC 7159 - JavaScript对象符号(JSON)数据交换格式 (强调我的):
对象是0个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串,number, 布尔值,空值,对象或数组 数组是由零个或多个值组成的命令序列。 “对象”;和“;array"来自的惯例 JavaScript。< / p >
数组是由零个或多个值组成的命令序列。
“对象”;和“;array"来自的惯例 JavaScript。< / p >
一些实现也保留了JSON对象的顺序,但这并不能保证。
数组([])中元素的顺序被保持。在一个“对象”({})中元素的顺序(名称:值对)不是,它们通常是“混乱”的,如果不是由JSON格式化器/解析器本身,那么是由特定于语言的对象(Dictionary, NSDictionary, Hashtable等)用作内部表示。
[]
{}
“JSON列表中元素的顺序是否被维护?”不是一个好问题。你需要问“当执行[…]时,JSON列表中元素的顺序是否被维护?”] ?” 正如Felix King所指出的,JSON是一种文本数据格式。它不会无缘无故地变异。不要混淆JSON字符串和(JavaScript)对象
你可能在谈论像JSON.stringify(JSON.parse(...))这样的操作。现在的答案是:这取决于实现。99%*的JSON解析器不维护对象的顺序,但确实维护数组的顺序,但您也可以使用JSON存储类似的东西
JSON.stringify(JSON.parse(...))
{ "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]); }