L'ordine degli elementi in un elenco JSON viene conservato?


254

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:


370

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.


Tuttavia, ho parlato con alcuni sviluppatori che hanno riscontrato problemi in cui gli array NON sono ordinati. Dai un'occhiata a questo passaggio stranamente scritto in ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 'La sintassi JSON non definisce alcun significato specifico per l'ordinamento dei valori. Tuttavia, la struttura dell'array JSON viene spesso utilizzata in situazioni in cui è presente una semantica nell'ordinamento. '
Cato

74

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.


7

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]);
}

16
Ma questo si basa su un comportamento indefinito da parte di JSON. Qualunque cosa con cui scambiate potrebbe non avere lo stesso comportamento.
Hot Licks,

3
Questa risposta discute un oggetto. La domanda si riferisce alla "lista" di json, che può essere dedotta solo come array medio, che è semanticamente ordinato dalla specifica json (vedi la risposta di Jeremy).
Tom,

5

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.

Demo qui e qui .


7
Ma questo si basa su un comportamento indefinito da parte di JSON. Qualunque cosa con cui scambiate potrebbe non avere lo stesso comportamento.
Hot Licks

1

"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ù :)


1
Sbagliato, almeno se stai parlando dell'utilizzo del parser JSON. V8 mantiene l'ordine e la mia ipotesi è che da solo rappresenta oltre l'1% dell'utilizzo del parser JSON. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin

3
@BenAtkin È divertente che il tuo link indichi la spiegazione di come V8 non mantiene l'ordine.
user123444555621

2
"Lo standard di fatto è quello di abbinare l'ordine di inserzione, cosa che fa anche V8, ma con un'eccezione"
Benjamin Atkin,

14
Tutti gli umani sono maschi, ma con un'eccezione: le donne sono femmine.
user123444555621
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.