我注意到 JSON 对象中元素的顺序不是原始顺序。
JSON 列表的元素呢?他们的秩序得到维护了吗?
我注意到 JSON 对象中元素的顺序不是原始顺序。
JSON 列表的元素呢?他们的秩序得到维护了吗?
是的,JSON 数组中元素的顺序被保留。来自RFC 7159 - JavaScript 对象表示法 (JSON) 数据交换格式 (重点是我的):
对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串、数字、布尔值、空值、对象或数组。
数组是零个或多个值的有序序列。
术语“对象”和“数组”来自 JavaScript 的约定。
一些实现也确实保留了 JSON 对象的顺序,但这不能保证。
数组 ( []
)中元素的顺序保持不变。“对象” ( {}
)中元素(名称:值对)的顺序不是,并且它们通常被“混淆”,如果不是由 JSON 格式化程序/解析器本身然后由语言特定的对象(字典, NSDictionary、Hashtable 等)用作内部表示。
实际上,如果键是 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将所有键都按插入顺序保存,除了可以解析为无符号 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 上,您将始终按此顺序获得dog、bear和monkey。Node.js 也使用 V8。即使您有数千个项目,这也将成立。YMMV 与其他 JavaScript 引擎。
“是否维护了 JSON 列表中元素的顺序?” 这不是一个好问题。您需要问“在执行 [...] 时,JSON 列表中的元素顺序是否得到维护?” 正如 Felix King 指出的那样,JSON 是一种文本数据格式。它不会无故变异。不要将 JSON 字符串与 (JavaScript) 对象混淆。
您可能正在谈论诸如JSON.stringify(JSON.parse(...))
. 现在的答案是:这取决于实现。99%* 的 JSON 解析器不维护对象的顺序,并维护数组的顺序,但您不妨使用 JSON 来存储类似
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
并使用维护对象顺序的解析器。
*可能更多:)