JSONリスト内の要素の順序は保持されますか?


254

JSONオブジェクトの要素の順序が元の順序ではないことに気付きました。

JSONリストの要素についてはどうですか?それらの順序は維持されますか?

回答:


370

はい、JSON配列内の要素の順序は保持されます。RFC 7159から-JavaScript Object Notation(JSON)データ交換フォーマット (強調鉱山):

オブジェクトは順不同です 0個以上の名前と値のペアのコレクションです。名前は文字列であり、値は文字列、数値、ブール値、null、オブジェクト、または配列です。

配列は、0個以上の値の順序付けられたシーケンスです。

「オブジェクト」と「配列」という用語は、JavaScriptの規則に由来しています。

一部の実装では、JSONオブジェクトの順序も保持されますが、これは保証されません。


ただし、配列が順序付けられていないという問題に遭遇した一部の開発者に話を聞いたことがあります。ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf のこの奇妙な言葉の節を見てください。「JSON構文は、値の順序に特定の意味を定義していません。ただし、JSON配列構造は、順序付けに意味がある場合によく使用されます。'
Cato

74

配列([])内の要素の順序は維持されます。「オブジェクト」()内の要素の順序(名前:値のペア){}はそうではありません。JSONフォーマッター/パーサー自体ではなく、言語固有のオブジェクト(辞書、 NSDictionary、Hashtableなど)。内部表現として使用されます。


7

実際には、キーのタイプがNaNの場合、ブラウザは順序を変更しません。

次のスクリプトは、「One」、「Two」、「Three」を出力します。

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

一方、次のスクリプトは「3」、「1」、「2」を出力します。

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

16
しかし、それはJSONの未定義の動作に依存しています。交換するものはすべて同じ動作をしない場合があります。
Hot Licks 2014

3
この回答ではオブジェクトについて説明します。質問は、jsonの「リスト」に関係します。これは、意味的にjsonの仕様で順序付けられている配列を意味するものとしか推測できません(ジェレミーの回答を参照)。
トム

5

一部の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エンジン。

ここここでデモ。


7
しかし、それはJSONの未定義の動作に依存しています。交換するものはすべて同じ動作をしない場合があります。
Hot Licks 2013年

1

「JSONリストの要素の順序は維持されますか?」良い質問ではありません。「[...]を実行するときにJSONリストの要素の順序は維持されますか?」Felix Kingが指摘したように、JSONはテキスト形式のデータ形式です。理由がなければ変異しません。JSON文字列と(JavaScript)オブジェクトを混同しないでください。

あなたはおそらくのような操作について話しているでしょうJSON.stringify(JSON.parse(...))。今の答えは:それは実装に依存します。JSONパーサーの99%*はオブジェクトの順序を維持せず、配列の順序を維持しますが、JSONを使用して次のようなものを保存することもできます

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

オブジェクトの順序を維持するパーサーを使用します。

*おそらくさらにもっと:)


1
間違っています。少なくとも、JSONパーサーの使用について話している場合は。V8は順序を維持します。おそらく、それだけでJSONパーサーの使用量の1%以上を占めると思います。code.google.com/p/v8/issues/detail?id=164#c1
ベンジャミンアトキン

3
@BenAtkin V8が順序を維持しない方法の説明へのリンクが指しているのはおかしいです。
user123444555621

2
「事実上の標準は挿入順序を一致させることですが、V8も同じですが、例外が1つあります」
Benjamin Atkin

14
すべての人間は男性ですが、1つの例外があります。女性は女性です。
user123444555621 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.