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?
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:
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.
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.
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]);
}
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.
"¿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 :)