Ho notato che l’ordine degli elementi in un object JSON non è l’ordine originale.
Che mi dici degli elementi delle liste JSON? Il loro ordine è mantenuto?
Sì, l’ordine degli elementi negli array JSON viene mantenuto. Da RFC 7159 -Il formato di interscambio dati JSON (JavaScript Object Notation) (enfasi mia):
Un object è un insieme non ordinato di zero o più coppie nome / valore, dove un nome è una stringa e un valore è una stringa, un numero, un booleano, un null, un object o un array.
Una matrice è una sequenza ordinata di zero o più valori.
I termini “object” e “matrice” derivano dalle convenzioni di JavaScript.
Viene mantenuto l’ordine degli elementi in un array ( []
). L’ordine degli elementi (nome: coppie di valori) in un “object” ( {}
) non lo è, ed è normale che siano “confusi”, se non dal formatterer / formattatore 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à “Uno”, “Due”, “Tre”:
var foo={"3":"Three", "1":"One", "2":"Two"}; for(bar in foo) { alert(foo[bar]); }
Mentre il seguente script mostrerà “Tre”, “Uno”, “Due”:
var foo={"@3":"Three", "@1":"One", "@2":"Two"}; for(bar in foo) { alert(foo[bar]); }
Alcuni motori JavaScript mantengono le chiavi nell’ordine di inserimento. V8, ad esempio, mantiene tutte le chiavi nell’ordine di inserimento tranne le chiavi che possono essere analizzate come 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)) { $('').text(animal).appendTo('#animals'); } }
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }'); for (var animal in animals) { $('').text(animal).appendTo('#animals'); }
Otterrai costantemente cane , orso e scimmia in questo ordine, su Chrome, che utilizza V8. Node.js utilizza anche V8. Questo vale anche se hai migliaia di oggetti. YMMV con altri motori JavaScript.
Demo qui e qui .
“L’ordine degli elementi in un elenco JSON è mantenuto?” non è una buona domanda Devi chiedere “È mantenuto l’ordine degli elementi in un elenco JSON quando si fa […]?” Come Felix King ha sottolineato, JSON è un formato di dati testuali. Non muta senza una ragione. Non confondere una stringa JSON con un object (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 degli array, ma si potrebbe anche usare JSON per memorizzare qualcosa come
{ "son": "David", "daughter": "Julia", "son": "Tom", "daughter": "Clara" }
e usa un parser che mantiene l’ordine degli oggetti.
* probabilmente ancora di più 🙂