web-dev-qa-db-fra.com

L'ordre des éléments dans une liste JSON est-il préservé?

J'ai remarqué que l'ordre des éléments dans un objet JSON n'était pas l'ordre original.

Qu'en est-il des éléments des listes JSON? Leur ordre est-il maintenu?

211
user437899

Oui, l'ordre des éléments dans les tableaux JSON est préservé. De RFC 7159 - Format d'échange de données JSON (JavaScript Object Notation) (l'emphase est mise à moi):

Un objet est une collection non ordonnée de zéro ou plusieurs paires nom/valeur, où un nom est une chaîne et une valeur est une chaîne, un nombre, un booléen, null, objet ou tableau.

Un tableau est une séquence ordonnée de zéro valeur ou plus.

Les termes "objet" et "tableau" proviennent des conventions de JavaScript.

317
Jeremy Banks

L'ordre des éléments d'un tableau ([]) est conservé. L'ordre des éléments (nom: paires de valeurs) dans un "objet" ({}) n'est pas, et il est habituel qu'ils soient "mélangés", sinon par le formateur/analyseur JSON lui-même, puis par le langage. objets spécifiques (Dictionnaire, NSDictionary, Hashtable, etc.) utilisés comme représentation interne.

60
Hot Licks

En pratique, si les clés étaient de type NaN, le navigateur ne modifierait pas l'ordre.

Le script suivant générera "Un", "Deux", "Trois":

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

Considérant que le script suivant générera "Trois", "Un", "Deux":

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

Certains moteurs JavaScript conservent les clés dans l'ordre d'insertion. V8, par exemple, conserve toutes les clés dans l'ordre d'insertion, à l'exception des clés pouvant être analysées comme des entiers non signés 32 bits .

Cela signifie que si vous exécutez l'une des opérations suivantes:

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

Vous obtiendrez toujours un chien , un ours et monkey dans cet ordre, sous Chrome, qui utilise la version 8. Node.js utilise également la V8. Cela sera vrai même si vous avez des milliers d'articles. YMMV avec d'autres moteurs JavaScript.

Démo ici et ici .

5
Benjamin Atkin

"L'ordre des éléments d'une liste JSON est-il conservé?" n'est pas une bonne question. Vous devez demander "L'ordre des éléments dans une liste JSON est-il conservé lorsque vous faites [...]?" Comme Felix King l'a souligné, JSON est un format de données textuel. Il ne mute pas sans raison. Ne confondez pas une chaîne JSON avec un objet (JavaScript).

Vous parlez probablement d'opérations comme JSON.stringify(JSON.parse(...)). Maintenant, la réponse est: cela dépend de la mise en œuvre. 99% * des analyseurs JSON ne conservent pas l'ordre des objets et conservent l'ordre des tableaux, mais vous pouvez également utiliser JSON pour stocker des éléments tels que

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

et utilisez un analyseur qui maintient l'ordre des objets.

* probablement encore plus :)

3
user123444555621