J'ai remarqué que l'ordre des éléments dans un objet JSON n'est pas l'ordre original.
Qu'en est-il des éléments des listes JSON ? Leur ordre est-il maintenu ?
J'ai remarqué que l'ordre des éléments dans un objet JSON n'est pas l'ordre original.
Qu'en est-il des éléments des listes JSON ? Leur ordre est-il maintenu ?
Oui, l'ordre des éléments dans les tableaux JSON est préservé. Depuis RFC 7159 - Le format d'échange de données JavaScript Object Notation (JSON) (c'est moi qui souligne) :
Un objet est un non ordonné collection de zéro ou plus de noms/valeurs où un nom est une chaîne de caractères et une valeur est une chaîne de caractères, un nombre, booléen, nul, objet ou tableau.
Un tableau est un commandé séquence de zéro ou plusieurs valeurs.
Les termes "objet" et "tableau" proviennent des conventions de JavaScript.
Certaines implémentations préservent également l'ordre des objets JSON, mais cela n'est pas garanti.
Cependant, j'ai parlé à des développeurs qui ont rencontré des problèmes lorsque les tableaux ne sont PAS ordonnés. Jetez un coup d'œil à ce passage étrangement formulé dans le document ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf La syntaxe JSON ne définit pas de signification spécifique pour l'ordre des valeurs. Cependant, la structure de tableau JSON est souvent utilisée dans des situations où l'ordre a une certaine sémantique. '
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 courant qu'ils soient "mélangés", si ce n'est par le formateur/parseur JSON lui-même, mais par les objets spécifiques au langage (Dictionary, NSDictionary, Hashtable, etc.) qui sont utilisés comme représentation interne.
En pratique, si les clés étaient de type NaN, le navigateur ne modifiera pas l'ordre.
Le script suivant produira "Un", "Deux", "Trois" :
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Alors que le script suivant produira "Trois", "Un", "Deux" :
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
Mais c'est compter sur un comportement non défini de la part de JSON. Tout ce avec quoi vous échangez peut ne pas avoir le même comportement.
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 qui peuvent être analysées comme des entiers 32 bits non signés. .
Cela signifie que si vous exécutez l'un des éléments suivants :
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 constamment chien , ours y singe dans cet ordre, sur Chrome, qui utilise V8. Node.js utilise également V8. Cela restera vrai même si vous avez des milliers d'éléments. YMMV avec d'autres moteurs JavaScript.
Mais c'est compter sur un comportement non défini de la part de JSON. Tout ce avec quoi vous échangez peut ne pas avoir le même comportement.
Cela peut fonctionner pour les petits objets. Il est tout à fait raisonnable d'avoir une implémentation d'objet qui stocke les trois premières paires clé/valeur dans un tableau, et passe à une table de hachage lorsque la quatrième entrée est ajoutée. Ou lorsque vos utilisateurs finaux ont un objet de plus que ce que vous avez testé.
" L'ordre des éléments dans une liste JSON est-il maintenu ? " n'est pas une bonne question. Vous devez demander "L'ordre des éléments d'une liste JSON est-il maintenu lors de l'exécution de [...] ?". Comme l'a souligné Felix King, 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(...))
. La réponse est la suivante : cela dépend de l'implémentation. 99%* des analyseurs JSON ne maintiennent pas l'ordre des objets, et maintiennent l'ordre des tableaux, mais vous pourriez tout aussi bien utiliser JSON pour stocker quelque chose comme
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
et utiliser un analyseur syntaxique qui maintient l'ordre des objets.
*probablement encore plus :)
Faux, du moins si vous parlez de l'utilisation de l'analyseur JSON. V8 maintient l'ordre, et je pense qu'il représente à lui seul plus de 1 % de l'utilisation des analyseurs JSON. code.google.com/p/v8/issues/detail?id=164#c1
@BenAtkin C'est drôle que votre lien pointe vers l'explication de la façon dont V8 fait no maintenir l'ordre.
"La norme de facto est de faire correspondre l'ordre d'insertion, ce que V8 fait également, mais avec une exception".
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.