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 d'origine.
Qu'en est-il des éléments des listes JSON? Est leur ordre maintenu?
5 réponses
Oui, l'ordre des éléments dans les tableaux JSON est préservé. De RFC 7159-le Format D'échange de données JSON (JavaScript Object Notation) (soulignement du mien):
Un objet est une collection non ordonnée de zéro ou plus nom / valeur paires, où un nom est une chaîne et une valeur est une chaîne, Nombre, booléen, null, objet ou tableau.
Un tableau est une séquence ordonnée de zéro ou plus de valeurs.
Les termes "objet" et "tableau" venir des conventions de JavaScript.
L'ordre des éléments dans un tableau ([]
) est maintenu. L'ordre des éléments (paires nom:valeur) dans un "objet" ({}
) ne l'est pas, et il est habituel qu'ils soient "Brouillés", sinon par le formateur/analyseur JSON lui-même, puis par les objets spécifiques à la langue (Dictionnaire, NSDictionary, Hashtable, etc) qui sont utilisés comme représentation interne.
Pratiquement parlant, si les clés étaient de type NaN, le navigateur ne changera pas l'ordre.
Le script suivant affichera "Un", "Deux", "Trois":
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Alors que le script suivant affichera "trois", "Un", "Deux":
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Certains moteurs JavaScript gardent 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 qui peuvent être analysées comme des entiers 32 bits non signés.
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 aurez toujours obtenir chien, ours, et singe, dans cet ordre, sur Chrome, qui utilise V8. Nœud.js utilise également V8. Ce sera vrai, même si vous avez des milliers d'articles. YMMV avec d'autres Les moteurs JavaScript.
"l'ordre des éléments dans une liste JSON est-il maintenu?"n'est pas une bonne question. Vous devez demander "Est l'ordre des éléments dans une liste JSON maintenue lors de l'exécution [...] ?" Comme Felix King l'a souligné, JSON est un format de données textuelles. Il n'est pas muter 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 maintiennent pas l'ordre de les objets, et maintenez l'ordre des tableaux, mais vous pouvez aussi bien utiliser JSON pour stocker quelque chose comme
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
Et utilisez un analyseur qui maintient l'ordre des objets.
*probablement encore plus :)