Selon Crockford json.org , un objet JSON est composé de membres , qui est composé de paires .
Chaque paire est constituée d'une chaîne et d'une valeur , avec un chaîne définie comme:
Une chaîne est une séquence de zéro ou plusieurs caractères Unicode, entourée de guillemets doubles, utilisant des échappements antislash. Un caractère est représenté comme une chaîne de caractères unique. Une chaîne ressemble beaucoup à une chaîne C ou Java.
Mais dans la pratique, la plupart des programmeurs ne savent même pas qu'une clé JSON doit être entourée de guillemets doubles, car la plupart des navigateurs ne nécessitent pas l'utilisation de guillemets doubles.
Est-il judicieux de prendre la peine d'entourer votre JSON entre guillemets?
Exemple valide:
{
"keyName" : 34
}
Par opposition à l'invalide:
{
keyName : 34
}
La vraie raison pour laquelle les clés JSON doivent être entre guillemets, repose sur la sémantique des identificateurs d'ECMAScript 3.
mots réservés ne peut pas être utilisé comme noms de propriété dans les littéraux d'objets sans guillemets, par exemple:
({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...
Alors que si vous utilisez des guillemets, les noms de propriété sont valides:
({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok
Le propre Crockford l'explique dans cet exposé , ils voulaient garder le standard JSON simple, et ils n'aimeraient pas avoir toutes ces restrictions sémantiques dessus:
....
C'est à ce moment que nous avons découvert le problème des noms non cités. Il s'avère que ECMA Script 3 a une politique Word réservée. Les mots réservés doivent être cités dans la position clé, ce qui est vraiment une nuisance. Lorsque je me suis mis à formuler cela en une norme, je ne voulais pas avoir à mettre tous les mots réservés dans la norme, car cela aurait l'air vraiment stupide.
À l'époque, j'essayais de convaincre les gens: oui, vous pouvez écrire des applications en JavaScript, ça va vraiment fonctionner et c'est un bon langage. Je ne voulais pas dire, alors, en même temps: et regardez cette chose vraiment stupide qu'ils ont faite! J'ai donc décidé, à la place, citons simplement les clés.
De cette façon, nous n'avons à dire à personne à quel point c'est fou.C'est pourquoi, à ce jour, les clés sont citées en JSON.
...
Le standard ECMAScript 5e édition corrige cela, maintenant dans une implémentation ES5, même les mots réservés peuvent être utilisés sans guillemets, dans les deux littéraux d'objet et l'accès membre (obj.function
Ok dans ES5).
Juste pour mémoire, cette norme est mise en œuvre ces jours-ci par les éditeurs de logiciels, vous pouvez voir quels navigateurs incluent cette fonctionnalité sur ce tableau de compatibilité (voir Mots réservés comme propriété noms )
Oui, c'est un JSON invalide et sera rejeté sinon dans de nombreux cas, par exemple jQuery 1.4+ a une vérification qui fait échouer silencieusement le JSON non cité. Pourquoi pas être conforme?
Prenons un autre exemple:
{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }
... tous ces éléments le seraient valables avec des guillemets, pourquoi ne pas être cohérents et les utiliser dans tous les cas, éliminant ainsi la possibilité d'un problème?
Un exemple plus courant dans le monde des développeurs Web: il existe des milliers d'exemples de code HTML non valide qui s'affichent dans la plupart des navigateurs ... est-ce que cela rend le débogage ou la maintenance moins pénible? Pas du tout, bien au contraire.
Aussi @ Matthew fait le meilleur point de tous dans les commentaires ci-dessous, cela déjà échoue, les clés non cotées jetteront une erreur de syntaxe avec JSON.parse()
dans tous les principaux navigateurs (et tous les autres qui l'implémentent correctement), vous pouvez le tester ici .