2014-09-21 48 views
6

當我使用json.net庫將json對象反序列化爲c#對象時,數組屬性中元素的順序是否會保持不變?例如:使用json.net進行反序列化時,數組順序是否保留?

public class MySonsThreeFootRadius 
{ 
    public Boolean IsMessy { get; set; } 
    public Toy[] ToysThrownOnFloor { get; set; } 
} 

public class Toy 
{ 
    public String Name { get; set; } 
} 

{ 
    "IsMessy": true, 
    "ToysThrownOnFloor": [ 
     { "Name": "Giraffe" }, 
     { "Name": "Ball" }, 
     { "Name": "Dad's phone" } 
    ] 
} 

是否ToysThrownOnFloor保留順序長頸鹿,球,和爸爸的電話,或者它可能潛在地重新排序?

回答

9

這取決於你正在使用的集合。

任何執行IEnumerable/IEnumerable<T>的類都可以被序列化爲JSON數組。 Json.NET會按順序處理集合,也就是說,它會按集合從GetEnumerator返回它們的順序來序列化數組項,並且會按照從JSON文件反序列化的順序將項添加到集合中(使用Add方法以防可變集合和具有集合參數的構造函數在不可變集合的情況下)。

這意味着,如果收集保存的物品(T[]List<T>Collection<T>ReadOnlyCollection<T>等)的訂單,訂單將被序列化和反序列化時保留。但是,如果收藏不能保留物品的訂單(HashSet<T>等),訂單將會丟失。

相同的邏輯適用於JSON對象。例如,當序列化Dictionary<TKey, TValue>時,訂單將會丟失,因爲此集合不保留項目的順序。

+0

這是有道理的。我對.net類型在這裏非常穩固,但我仍然不確定json.net反序列化是否會保持順序。我不想對引擎蓋下發生的事情做出任何假設。 – Chris 2014-09-21 05:15:05

3

json spec沒有具體指出的順序應該被保留,而它說:

一種陣列結構是一對周圍零個 或多個值方括號記號。這些值由逗號分隔。 值的順序非常重要。

該規範還規定:

JSON還規定值的有序列表的支持。所有 編程語言都有一些用於表示這樣的 列表的功能,可以使用數組,名稱或列表等名稱。

而且從json.net documentation,在反序列化的例子無疑暗示被保存的順序:

string json = @"[ 
    { 
    'Name': 'Product 1', 
    'ExpiryDate': '2000-12-29T00:00Z', 
    'Price': 99.95, 
    'Sizes': null 
    }, 
    { 
    'Name': 'Product 2', 
    'ExpiryDate': '2009-07-31T00:00Z', 
    'Price': 12.50, 
    'Sizes': null 
    } 
]"; 

List<Product> products = JsonConvert.DeserializeObject<List<Product>>(json); 

Console.WriteLine(products.Count); 
// 2 

Product p1 = products[0]; 

Console.WriteLine(p1.Name); 
// Product 1 

基於規範和json.net文檔,這將是安全的假設,順序是保存。

+3

從您引用的規範中可以看出:**這些值的順序很重要。**這並不完全是指應該保留順序嗎? – Falanwe 2014-09-21 01:02:32

+0

@Falanwe,這是一個很好的問題。我認爲可以安全地根據規格保留訂單。只取決於實施。 – 2014-09-21 01:06:59

+0

@Falanwe,請參閱最近的編輯規範討論有序的值列表。 – 2014-09-21 01:12:12