2014-09-21 17 views
6

Czy kolejność elementów w właściwości tablicy zostanie zachowana po deserializacji obiektu Json do obiektu C# przy użyciu biblioteki json.net? Na przykład:Czy kolejność tablic jest zachowywana podczas deserializacji przy użyciu 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" } 
    ] 
} 

Czy ToysThrownOnFloor zachowują Żyrafa zamówienia, piłka, i telefon taty, lub może potencjalnie być kolejność?

Odpowiedz

9

To zależy od tego, z której kolekcji korzystasz.

Każda klasa implementująca IEnumerable/IEnumerable<T> może zostać przekształcona do postaci szeregowej jako tablica JSON. Json.NET przetwarza kolekcję sekwencyjnie, to znaczy serializuje elementy tablicy w kolejności, w jakiej kolekcja zwraca je od GetEnumerator i doda elementy do kolekcji w kolejności, w której są deserializowane z pliku JSON (przy użyciu metody Add w przypadku zmiany wartości kolekcje i konstruktor z argumentem kolekcji w przypadku niezmiennych zbiorów).

Oznacza to, że jeśli zbiór zachowuje kolejność elementów (T[], List<T>, Collection<T>, ReadOnlyCollection<T> itp), kolejność zostanie zachowana podczas szeregowania i deserializacji. Jeśli jednak kolekcja nie zachowuje porządku elementów (HashSet<T> itp.), Zamówienie zostanie utracone.

Ta sama logika dotyczy obiektów JSON. Na przykład, zamówienie zostanie utracone podczas serializacji Dictionary<TKey, TValue>, ponieważ ta kolekcja nie zachowuje porządku elementów.

+0

To ma sens. Byłem całkiem niezły w kwestii typu .net, ale wciąż nie byłem pewien, czy deserializacja json.net ma utrzymać kolejność. Nie chciałem przyjmować żadnych założeń na temat tego, co działo się pod maską. – Chris

3

The json spec nie wskazuje wyraźnie, że kolejność powinna być zachowana, a on mówi:

Struktura tablica jest para nawiasów kwadratowych żetonów okolic zera lub więcej wartości. Wartości są oddzielone przecinkami. Kolejność wartości jest znacząca.

Spec stwierdza również:

JSON zapewnia również wsparcie dla list uporządkowanych wartości. Wszystkie języki programowania będą miały pewną funkcję do reprezentowania takich list , które mogą mieć nazwy takie jak tablica, wektor lub lista.

I od json.net documentation, przykład deserializacji pewnością nawiązuje do a porządek jest zachowany:

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 

podstawie specyfikacji i dokumentacji Json.NET byłoby bezpiecznie założyć, że kolejność jest zachowane.

+3

Z podanej specyfikacji: ** Kolejność wartości jest znacząca. ** Czy to nie oznacza, że ​​zamówienie powinno zostać zachowane? – Falanwe

+0

@Fananwe, to dobre pytanie. Myślę, że można bezpiecznie założyć, że zamówienie zostało zachowane w oparciu o specyfikację. Tylko zależy od wdrożenia. –

+0

@Falanwe, zobacz ostatnią zmianę, w której specyfikacja mówi o uporządkowanej liście wartości. –

Powiązane problemy