2014-09-21 15 views
6

L'ordine degli elementi in una proprietà dell'array verrà mantenuto quando deserializzo un oggetto json in un oggetto C# utilizzando quindi la libreria json.net? Per esempio:L'ordine dell'array viene conservato durante la deserializzazione con 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" } 
    ] 
} 

Does ToysThrownOnFloor mantenere l'ordine Giraffe, Palla, e il telefono di papà, o potrebbe potenzialmente essere riordinati?

risposta

9

Dipende da quale raccolta si sta utilizzando.

Qualsiasi classe che implementa IEnumerable/IEnumerable<T> può essere serializzata come una matrice JSON. Json.NET elabora la raccolta in sequenza, ovvero serializza gli elementi dell'array nell'ordine in cui la raccolta li restituisce da GetEnumerator e aggiunge elementi alla raccolta nell'ordine in cui sono deserializzati dal file JSON (utilizzando il metodo Add in caso di mutabile collezioni e costruttore con argomento raccolta in caso di collezioni immutabili).

Ciò significa che se la raccolta preserva l'ordine degli elementi (T[], List<T>, Collection<T>, ReadOnlyCollection<T> ecc), l'ordine sarà preservato durante la serializzazione e deserializzazione. Tuttavia, se una raccolta non conserva l'ordine degli articoli (HashSet<T> ecc.), L'ordine verrà perso.

La stessa logica si applica agli oggetti JSON. Ad esempio, l'ordine verrà perso durante la serializzazione di Dictionary<TKey, TValue>, poiché questa raccolta non conserva l'ordine degli articoli.

+0

Questo ha senso. Ero abbastanza solido sul tipo .net, ma non ero sicuro che la deserializzazione di json.net avrebbe mantenuto l'ordine. Non volevo fare supposizioni su quello che stava succedendo sotto il cofano. – Chris

3

Il json spec non sia espressamente indicato che l'ordine deve essere conservato, anzi dice:

una struttura a matrice è una coppia di gettoni staffa quadrati circostanti a zero o più valori. I valori sono separati da virgole. L'ordine dei valori è significativo.

Le specifiche afferma inoltre:

JSON fornisce anche il supporto per gli elenchi ordinati di valori. Tutti i linguaggi di programmazione avranno alcune funzionalità per rappresentare tali elenchi , che possono essere denominati come array, vettore o elenco.

E dal json.net documentation, l'esempio deserializzazione allude certamente l'ordine di essere preservata:

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 

Sulla base delle specifiche e la documentazione json.net, sarebbe lecito ritenere che l'ordine è conservato.

+3

Dalla specifica che citi: ** L'ordine dei valori è significativo. ** Questo non significa esattamente che l'ordine debba essere conservato? – Falanwe

+0

@Falanwe, questa è una buona domanda. Penso che sia sicuro presumere che l'ordine sia preservato in base alle specifiche. Dipende solo dall'implementazione. –

+0

@Fananwe, vedere la modifica recente in cui le specifiche parlano di un elenco di valori ordinato. –

Problemi correlati