Ho notato che l'ordine degli elementi in un oggetto JSON non è l'ordine originale.
E gli elementi delle liste JSON? Il loro ordine è mantenuto?
Ho notato che l'ordine degli elementi in un oggetto JSON non è l'ordine originale.
E gli elementi delle liste JSON? Il loro ordine è mantenuto?
Risposte:
Sì, l'ordine degli elementi nelle matrici JSON viene conservato. Da RFC 7159 -Il formato di interscambio di dati JSON (JavaScript Object Notation) (sottolineatura mia):
Un oggetto è una raccolta non ordinata di zero o più coppie nome / valore, in cui un nome è una stringa e un valore è una stringa, numero, valore booleano, null, oggetto o matrice.
Un array è una sequenza ordinata di zero o più valori.
I termini "oggetto" e "matrice" derivano dalle convenzioni di JavaScript.
Alcune implementazioni mantengono anche l'ordine degli oggetti JSON, ma questo non è garantito.
L'ordine degli elementi in un array ( []
) viene mantenuto. L'ordine degli elementi (nome: coppie di valori) in un "oggetto" ( {}
) non lo è, ed è normale che siano "confusi", se non dal formattatore / parser JSON stesso, quindi dagli oggetti specifici della lingua (Dizionario, NSDictionary, Hashtable, ecc.) Utilizzati come rappresentazione interna.
In pratica, se le chiavi fossero di tipo NaN, il browser non cambierà l'ordine.
Il seguente script mostrerà "One", "Two", "Three":
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Considerando che il seguente script produrrà "Tre", "Uno", "Due":
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Alcuni motori JavaScript mantengono le chiavi in ordine di inserimento. V8, ad esempio, mantiene tutte le chiavi in ordine di inserimento tranne quelle che possono essere analizzate come numeri interi a 32 bit senza segno .
Ciò significa che se si esegue una delle seguenti operazioni:
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');
}
Avrai costantemente cane , orso e scimmia in quell'ordine, su Chrome, che utilizza V8. Node.js utilizza anche V8. Ciò sarà valido anche se hai migliaia di articoli. YMMV con altri motori JavaScript.
"L'ordine degli elementi in un elenco JSON è mantenuto?" non è una buona domanda. È necessario chiedere "L'ordine degli elementi in un elenco JSON viene mantenuto quando si fa [...]?" Come ha sottolineato Felix King, JSON è un formato di dati testuali. Non muta senza motivo. Non confondere una stringa JSON con un oggetto (JavaScript).
Probabilmente stai parlando di operazioni come JSON.stringify(JSON.parse(...))
. Ora la risposta è: dipende dall'implementazione. Il 99% * dei parser JSON non mantiene l'ordine degli oggetti e mantiene l'ordine delle matrici, ma potresti anche usare JSON per archiviare qualcosa come
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
e usa un parser che mantiene l'ordine degli oggetti.
* probabilmente anche di più :)