2011-08-27 46 views
157

我注意到JSON對象中元素的順序不是原始順序。是否保存了JSON列表中元素的順序?

JSON列表的元素呢?他們的訂單是否維持?

+3

你必須更具體。 JSON是一種數據交換格式,基本上是**文本**。角色不會隨意改變他們的位置。您將以與發送相同的方式收到它。 –

+1

我會引導人們在json.org上使用官方的JSON語法。 JSON沒有「列表」。它有「數組」和「對象」。 –

回答

248

是的,JSON數組中元素的順序被保留。從RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (重點煤礦):

一個目的是無序收集零個或多個名稱/值 對,其中名是一個字符串,一個值是一個字符串,數字 布爾值,null ,對象或數組。

數組是訂購的零或更多值的序列。

術語「對象」和「數組」來自於JavaScript的慣例 。

44

維護數組中元素的順序([])。 「對象」({})中元素的順序(名稱:值對)不是,它們通常是「混亂」的,如果不是由JSON格式器/解析器本身,那麼通過特定於語言的對象(字典,NSDictionary,Hashtable等),用作內部表示。

3

「是否保持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%以上。 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。即使你有成千上萬的物品,這也會成立。 YMMV與其他JavaScript引擎。

演示herehere

+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

相關問題