A ordem dos elementos em uma lista JSON é preservada?

254

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?

user437899
fonte

Respostas:

370

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.

Jeremy Banks
fonte
No entanto, falei com alguns desenvolvedores que encontraram problemas nos quais matrizes NÃO são ordenadas. Dê uma olhada nesta passagem estranhamente escrita em ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 'A sintaxe JSON não define nenhum significado específico para a ordem dos valores. No entanto, a estrutura da matriz JSON é frequentemente usada em situações em que há alguma semântica na ordem. '
Cato
74

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.

Hot Licks
fonte
7

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]);
}
Salam Barbary
fonte
16
Mas isso depende de um comportamento indefinido por parte do JSON. Qualquer coisa com que você troque pode não ter o mesmo comportamento.
Hot Licks
3
Esta resposta discute um objeto. A pergunta se refere à lista "json", que só pode ser inferida como matriz, que é ordenada semanticamente pela especificação json (consulte a resposta de Jeremy).
Tom
5

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.

Demonstração aqui e aqui .

Benjamin Atkin
fonte
7
Mas isso depende de um comportamento indefinido por parte do JSON. Qualquer coisa com que você troque pode não ter o mesmo comportamento.
Hot Licks
1

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

user123444555621
fonte
1
Errado, pelo menos se você estiver falando sobre o uso do analisador JSON. A V8 mantém a ordem, e meu palpite é que, por si só, é responsável por mais de 1% do uso do analisador JSON. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin
3
@ BenAtkin É engraçado que o seu link indique a explicação de como o V8 não mantém o pedido.
User123444555621
2
"O padrão de facto é combinar ordem de inserção, que V8 também faz, mas com uma exceção"
Benjamin Atkin
14
Todos os seres humanos são homens, mas com uma exceção: as mulheres são mulheres.
user123444555621