Notei que a ordem dos elementos em um objeto JSON não é a ordem original.
E os elementos das listas JSON? A ordem deles é mantida?
Notei que a ordem dos elementos em um objeto JSON não é a ordem original.
E os elementos das listas JSON? A ordem deles é mantida?
Respostas:
Sim, a ordem dos elementos nas matrizes JSON é preservada. Do RFC 7159 - O formato de intercâmbio de dados JavaScript Object Notation (JSON) (ênfase minha):
Um objeto é um não ordenado coleção de zero ou mais pares de nome / valor, em que um nome é uma sequência e um valor é uma sequência, número, booleano, nulo, objeto ou matriz.
Uma matriz é uma sequência ordenada de zero ou mais valores.
Os termos "objeto" e "matriz" vêm das convenções do JavaScript.
Algumas implementações também preservam a ordem dos objetos JSON, mas isso não é garantido.
A ordem dos elementos em uma matriz ( []
) é mantida. A ordem dos elementos (nome: pares de valores) em um "objeto" ( {}
) não é e é comum que sejam "confusos", se não pelo formatador / analisador JSON em si, e pelos objetos específicos do idioma (Dictionary, NSDictionary, Hashtable, etc) que são usados como uma representação interna.
Na prática, se as chaves forem do tipo NaN, o navegador não alterará a ordem.
O script a seguir exibirá "Um", "Dois", "Três":
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Enquanto o script a seguir produzirá "Três", "Um", "Dois":
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Alguns mecanismos JavaScript mantêm as chaves em ordem de inserção. A V8, por exemplo, mantém todas as chaves em ordem de inserção, exceto as que podem ser analisadas como números inteiros de 32 bits não assinados .
Isso significa que se você executar um dos seguintes procedimentos:
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');
}
Você sempre terá cachorro , urso e macaco nessa ordem, no Chrome, que usa a V8. O Node.js também usa a V8. Isso será válido mesmo se você tiver milhares de itens. YMMV com outros mecanismos JavaScript.
"A ordem dos elementos em uma lista JSON é mantida?" não é uma boa pergunta Você precisa perguntar "A ordem dos elementos em uma lista JSON é mantida ao fazer [...]?" Como Felix King apontou, o JSON é um formato de dados textuais. Não muda sem uma razão. Não confunda uma sequência JSON com um objeto (JavaScript).
Você provavelmente está falando sobre operações como JSON.stringify(JSON.parse(...))
. Agora a resposta é: depende da implementação. 99% * dos analisadores JSON não mantêm a ordem dos objetos e a ordem das matrizes, mas você também pode usar o JSON para armazenar algo como
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
e use um analisador que mantenha a ordem dos objetos.
* provavelmente ainda mais :)