web-dev-qa-db-ja.com

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

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

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

204
user437899

はい、JSON配列の要素の順序は保持されます。 From RFC 7159 -JavaScript Object Notation(JSON)Data Interchange Format (エンファシス鉱山):

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

配列は、0個以上の値のorderedシーケンスです。

「オブジェクト」および「配列」という用語は、JavaScriptの規則に基づいています。

308
Jeremy

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

58
Hot Licks

実際には、キーのタイプが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]);
}
8
Salam Barbary

一部の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');
}

一貫してdogbear、およびmonkeyの順に、V8を使用するChromeで。 Node.jsもV8を使用します。これは、数千のアイテムがある場合でも当てはまります。 YMMVと他のJavaScriptエンジン。

デモ here および here

5
Benjamin Atkin

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

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

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

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

*おそらくさらに:)

3