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

IT技术 javascript arrays json list
2021-01-11 05:29:12

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

JSON 列表的元素呢?他们的秩序得到维护了吗?

5个回答

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

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

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

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

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

@Cato 那段话并不意味着数组可能是无序的。这意味着对数组进行排序的原因可能是未知的,因为您没有指定对它进行排序的原因。
2021-03-16 05:29:12
但是,我曾与一些遇到过数组未排序问题的开发人员进行了交谈。看看ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf中这个措辞古怪的段落 “JSON 语法没有对值的排序定义任何特定含义。但是,JSON 数组结构通常用于排序有一些语义的情况。'
2021-03-19 05:29:12

数组 ( [])中元素的顺序保持不变。“对象” ( {})中元素(名称:值对)的顺序不是,并且它们通常被“混淆”,如果不是由 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]);
}
这个答案讨论了一个对象。该问题与 json "list" 相关,它只能推断为表示数组,该数组由 json 规范在语义上排序(请参阅 Jeremy 的回答)。
2021-04-04 05:29:12
但这依赖于 JSON 方面未定义的行为。您与之交换的任何内容都可能具有不同的行为。
2021-04-10 05:29:12

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

演示在这里这里

但这依赖于 JSON 方面未定义的行为。您与之交换的任何内容都可能具有不同的行为。
2021-04-05 05:29:12

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

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

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

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

*可能更多:)

所有人都是男性,但有一个例外:女性是女性。
2021-03-16 05:29:12
“事实上的标准是匹配插入顺序,V8 也这样做,但有一个例外”
2021-03-19 05:29:12
@BenAtkin 有趣的是,您的链接指向有关 V8 如何保持顺序的解释
2021-03-22 05:29:12
错了,至少如果你在谈论 JSON 解析器的使用。V8 维护顺序,我的猜测是它单独占 JSON 解析器使用量的 1% 以上。code.google.com/p/v8/issues/detail?id=164#c1
2021-04-02 05:29:12