2011-08-27 22 views
157

JSONオブジェクト内の要素の順序が元の順序ではないことに気付きました。JSONリストの要素の順序は保持されていますか?

JSONリストの要素はどうですか?彼らの命令は維持されていますか?

+3

より具体的にする必要があります。 JSONはデータ交換形式で、基本的に**テキスト**です。キャラクターは自分の位置を任意に変えません。あなたはそれをあなたが送ったのと同じ方法で受け取ります。 –

+1

私はjson.orgの公式のJSON構文に従います。 JSONには「リスト」はありません。それは "配列"と "オブジェクト"を持っています。 –

答えて

248

はい、JSON配列の要素の順序は保持されます。 RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format から(強調鉱山):

オブジェクトはゼロ以上の名前/値ペアの 順不同コレクション、名前が文字列であり、値はストリング、数、 ブール値、ヌルであります、オブジェクト、または配列。

配列は、0以上の値のの順序で配列されたです。

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

44

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

3

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

あなたはたぶんJSON.stringify(JSON.parse(...))のような操作について話しているでしょう。今答えは:それは実装に依存します。 JSONパーサーの99%*は、オブジェクトの順序を維持しない、と配列の秩序を維持しますが、あなたは同様に

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

のようなものを保存し、オブジェクトの順序を維持パーサーを使用するためにJSONを使用する場合があります。

は*おそらくもっと:)

+1

JSONパーサーの使い方について話しているのであれば、間違っています。 V8は注文を維持していますが、JSONパーサーの使用量の1%以上を占めると推測されます。 http://code.google.com/p/v8/issues/detail?id=164#c1 –

+2

@BenAtkinあなたのリンクは、V8が**どのように注文を維持しないかについての説明を指しているのは面白いです。 – user123444555621

+2

"デファクトスタンダードは、 V8も同じですが、例外はありません。" –

5

いくつかのJavaScriptエンジンは、挿入順にキーを保持します。 V8、例えば、keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers

これは、次のいずれかを実行する場合ことを意味します、

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

あなたは一貫してChromeで、そのためにを負担し、を取得しますV8を使用します。 Node.jsはV8も使用します。これは何千ものアイテムがあっても当てはまります。他のJavaScriptエンジンとのYMMV

デモhereおよびhere

+4

しかし、それはJSONの部分で未定義の動作に依存しています。交換するものは、同じ動作をしていない可能性があります。 –

7

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

+11

しかし、それはJSONの部分で未定義の動作に依存しています。交換するものは、同じ動作をしていない可能性があります。 –

+0

この回答は、オブジェクトについて説明します。質問はjsonの "list"に関連しています。これは配列を意味するとしか推測できません。これは意味的にjsonの仕様で順序付けられています(Jeremyの答えを参照)。 – Tom

関連する問題