回答
是的,JSON數組中元素的順序被保留。從RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (重點煤礦):
一個目的是無序收集零個或多個名稱/值 對,其中名是一個字符串,一個值是一個字符串,數字 布爾值,null ,對象或數組。
數組是訂購的零或更多值的序列。
術語「對象」和「數組」來自於JavaScript的慣例 。
維護數組中元素的順序([]
)。 「對象」({}
)中元素的順序(名稱:值對)不是,它們通常是「混亂」的,如果不是由JSON格式器/解析器本身,那麼通過特定於語言的對象(字典,NSDictionary,Hashtable等),用作內部表示。
「是否保持JSON列表中的元素順序?」這不是一個好問題。你需要問「在執行[...]時是否保持JSON列表中元素的順序?」 Felix King指出,JSON是一種文本數據格式。沒有理由,它不會變異。不要將JSON字符串與(JavaScript)對象混淆。
您可能在談論像JSON.stringify(JSON.parse(...))
這樣的操作。現在答案是:這取決於實施。 JSON解析器的99%*不維護對象的順序,並做維護陣列的順序,但你還不如用JSON存儲像
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
和使用維護對象的順序解析器。
*可能更:)
錯誤,至少如果你在談論JSON解析器的用法。 V8維護訂單,我的猜測是,它本身佔JSON解析器使用量的1%以上。 http://code.google.com/p/v8/issues/detail?id=164#c1 –
@BenAtkin有趣的是,您的鏈接指向V8如何不**保持訂單的解釋。 – user123444555621
「事實上的標準是匹配 插入順序,V8也是這樣,但有一個例外」 –
一些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引擎。
但是這依賴於JSON部分的未定義行爲。您交換的任何內容都可能不具有相同的行爲。 –
實際上,如果鍵的類型是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部分的未定義行爲。您交換的任何內容都可能不具有相同的行爲。 –
這個答案討論一個對象。這個問題涉及json「list」,它只能被推斷爲意味着數組,這是按照json規範的語義排序的(參見Jeremy的回答)。 – Tom
- 1. JSON數組反序列化 - 是否總是保存元素的順序?
- 2. 序列模式元素是否保證子元素的順序?
- 3. unordered_set :: erase(pos)是否保留了元素的順序?
- 4. 向量元素是否保證順序?
- 5. IOrderedEnumerable.Select()是否保留元素順序?
- 6. Python列表是否保證其元素保持它們插入的順序?
- 7. 順序列表的元素
- 8. PyYAML - 是保存列表的順序嗎?
- 9. 如何在使用SimpleXML序列化時保存列表中元素的順序?
- 10. 是否保證了列表理解的結果順序?
- 11. 在ramda.js中,fromPairs是否改變了元素的順序?
- 12. 列表中是否存在元素?
- 13. 檢查列表中的元素是否存在於python列表的元素中
- 14. 是否在MongoDB中保存了插入順序?
- 15. 在保留順序的同時從包含不可保存元素的Python列表中刪除重複元素?
- 16. XML是否關心元素的順序?
- 17. xmlns元素的順序是否重要
- 18. ASP.Net:是否定義了Request.Form元素的順序?
- 19. std :: sort是否改變了相等元素的相對順序?
- 20. 是否保證Dictionary.Values按照添加的順序返回元素?
- 21. Linq to Objects:GroupBy是否保留元素的順序?
- 22. MongoDB數組內的元素順序是否保證一致?
- 23. 檢查列表元素是否存在於另一個列表的元素中
- 24. JSON不保存順序
- 25. 如何按順序保存路徑中的單元列表?
- 26. 保存排序中的元素的算法維護順序
- 27. 表中的列順序是否重要?
- 28. IEnumerable是否<TSource> Concat <TSource>保存元素的順序?
- 29. 數組或列表中的項目是否保持其順序?
- 30. 保存列表框的順序mvc2
你必須更具體。 JSON是一種數據交換格式,基本上是**文本**。角色不會隨意改變他們的位置。您將以與發送相同的方式收到它。 –
我會引導人們在json.org上使用官方的JSON語法。 JSON沒有「列表」。它有「數組」和「對象」。 –