¿Se conserva el orden de los elementos en una lista JSON?


254

Noté que el orden de los elementos en un objeto JSON no es el orden original.

¿Qué pasa con los elementos de las listas JSON? ¿Se mantiene su orden?

Respuestas:


370

Sí, se conserva el orden de los elementos en las matrices JSON. Del RFC 7159 -El formato de intercambio de datos de notación de objetos JavaScript (JSON) (énfasis mío):

Un objeto es una colección desordenada de cero o más pares de nombre / valor, donde un nombre es una cadena y un valor es una cadena, número, booleano, nulo, objeto o matriz.

Una matriz es una secuencia ordenada de cero o más valores.

Los términos "objeto" y "matriz" provienen de las convenciones de JavaScript.

Algunas implementaciones también preservan el orden de los objetos JSON, pero esto no está garantizado.


Sin embargo, he hablado con algunos desarrolladores que han encontrado problemas donde los arreglos NO están ordenados. Eche un vistazo a este pasaje redactado de forma extraña en ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 'La sintaxis JSON no define ningún significado específico para el orden de los valores. Sin embargo, la estructura de matriz JSON a menudo se usa en situaciones en las que hay alguna semántica en el pedido. '
Cato

74

Se []mantiene el orden de los elementos en una matriz ( ). El orden de los elementos (nombre: pares de valores) en un "objeto" ({} ) no lo es, y es habitual que estén "mezclados", si no es por el formateador / analizador JSON en sí y luego por los objetos específicos del idioma (Diccionario, NSDictionary, Hashtable, etc.) que se utilizan como representación interna.


7

En términos prácticos, si las claves fueran del tipo NaN, el navegador no cambiará el orden.

El siguiente script generará "Uno", "Dos", "Tres":

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

Mientras que el siguiente script generará "Tres", "Uno", "Dos":

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

16
Pero eso depende de un comportamiento indefinido por parte de JSON. Cualquier cosa con la que intercambies puede no tener el mismo comportamiento.
Hot Licks

3
Esta respuesta discute un objeto. La pregunta se relaciona con la "lista" de json, que solo se puede inferir que significa matriz, que está semánticamente ordenada por la especificación de json (ver la respuesta de Jeremy).
Tom

5

Algunos motores de JavaScript mantienen las claves en orden de inserción. V8, por ejemplo, mantiene todas las claves en orden de inserción, excepto las claves que se pueden analizar como enteros de 32 bits sin signo .

Esto significa que si ejecuta cualquiera de los siguientes:

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

Conseguirás constantemente perros , osos y monos en ese orden, en Chrome, que usa V8. Node.js también usa V8. Esto será válido incluso si tiene miles de artículos. YMMV con otros motores de JavaScript.

Demostración aquí y aquí .


77
Pero eso depende de un comportamiento indefinido por parte de JSON. Cualquier cosa con la que intercambies puede no tener el mismo comportamiento.
Hot Licks

1

"¿Se mantiene el orden de los elementos en una lista JSON?" No es una buena pregunta. Debe preguntar "¿Se mantiene el orden de los elementos en una lista JSON al hacer [...]?" Como señaló Felix King, JSON es un formato de datos textuales. No muta sin una razón. No confunda una cadena JSON con un objeto (JavaScript).

Probablemente estés hablando de operaciones como JSON.stringify(JSON.parse(...)). Ahora la respuesta es: depende de la implementación. El 99% * de los analizadores JSON no mantienen el orden de los objetos y mantienen el orden de las matrices, pero también podría usar JSON para almacenar algo como

{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

y use un analizador que mantenga el orden de los objetos.

* probablemente aún más :)


1
Incorrecto, al menos si estás hablando del uso del analizador JSON. V8 mantiene el orden, y supongo que solo representa más del 1% del uso del analizador JSON. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin

3
@BenAtkin Es curioso que su enlace apunte a la explicación de cómo V8 no mantiene el orden.
user123444555621

2
"El estándar de facto es hacer coincidir el orden de inserción, que también lo hace V8, pero con una excepción"
Benjamin Atkin

14
Todos los humanos son hombres, pero con una excepción: las mujeres son mujeres.
user123444555621
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.