La spécification JSON indique que JSON est un objet ou un tableau. Dans le cas d'un objet,
Une structure d'objet est représentée par une paire d'accolades entourant zéro ou plusieurs paires nom / valeur (ou membres). Un nom est une chaîne. ...
Et plus tard, la spécification dit qu'une chaîne est entourée de guillemets.
Pourquoi?
Donc,
{"Property1":"Value1","Property2":18}
et pas
{Property1:"Value1",Property2:18}
Question 1 : pourquoi ne pas autoriser le nom dans les paires nom / valeur à être des identificateurs sans guillemets?
Question 2 : Y a-t-il une différence sémantique entre les deux représentations ci-dessus, lorsqu'elles sont évaluées en Javascript?
javascript
json
Cheeso
la source
la source
eval()
(c'est-à-dire javascript).Réponses:
La philosophie de conception de JSON est "Keep it simple"
"Citer les noms avec
"
" est beaucoup plus simple que "Vous pouvez citer des noms avec"
ou,'
mais vous n'êtes pas obligé de le faire, sauf s'ils contiennent certains caractères (ou des combinaisons de caractères qui en feraient un mot-clé) et /'
ou"
pourraient devoir être cités selon sur quel délimiteur vous avez sélectionné " .Non. En JavaScript, ils sont identiques.
la source
JSON.parse
fonction:JSON.parse('{"a":1}')
fonctionne bien , pourquoiJSON.parse('{a:1}')
va soulever une exception .JSON.parse
est un analyseur JSON implémenté en JavaScript, ce n'est pas un analyseur JavaScript.Je laisse une citation d'une présentation que Douglas Crockford (le créateur de la norme JSON) a donnée à Yahoo.
Il explique comment il a découvert JSON et, entre autres, pourquoi il a décidé d'utiliser les clés entre guillemets :
Vous pouvez trouver la vidéo complète et la transcription ici .
la source
{ a }
où la propriété 'a' copie la valeur d'une variable globale ou locale 'a'.{[key]: value}
Les
:
espaces et les espaces sont autorisés dans les identificateurs. Sans les guillemets, cela provoquerait une ambiguïté lors de la tentative de déterminer ce qui constitue exactement l'identifiant.la source
En javascript, les objets peuvent être utilisés comme un hash / hashtable avec des paires de clés.
Cependant, si votre clé contient des caractères que javascript ne peut pas tokeniser en tant que nom, elle échouerait en essayant d'accéder comme une propriété sur un objet plutôt qu'une clé.
les identificateurs peuvent parfois avoir des caractères qui ne peuvent pas être évalués en tant que jeton / identificateur en javascript, il est donc préférable de mettre tous les identificateurs dans des chaînes pour des raisons de cohérence.
la source
Je pense que la bonne réponse à la question de Cheeso est que la mise en œuvre a dépassé la documentation. Il ne nécessite plus une chaîne comme clé, mais plutôt autre chose, qui peut être une chaîne (c'est-à-dire entre guillemets) ou (probablement) tout ce qui peut être utilisé comme nom de variable, ce qui, je suppose, signifie commencer par une lettre, _ , ou $, et n'incluent que les lettres, les chiffres et les $ et _.
Je voulais simplifier le reste pour la prochaine personne qui visite cette question avec la même idée que moi. Voici la viande:
Les noms de variables ne sont pas interpolés en JSON lorsqu'ils sont utilisés comme clé d'objet (Merci Friedo!)
Breton, utilisant "identifiant" au lieu de "clé", a écrit que "si un identifiant se trouve être un mot réservé, il est interprété comme ce mot plutôt que comme un identifiant". Cela peut être vrai, mais je l'ai essayé sans aucun problème:
=> 6
À propos des guillemets, Quentin a écrit "... mais ce n'est pas obligatoire, à moins que [la clé] contienne certains caractères (ou combinaisons de caractères qui en feraient un mot-clé)"
J'ai trouvé que la première partie (certains caractères) est vraie, en utilisant le signe @ (en fait, je pense que $ et _ sont les seuls caractères qui ne causent pas l'erreur):
=> Erreur de syntaxe
=> 1
mais la parenthèse sur les mots clés, comme je l'ai montré ci-dessus, n'est pas vraie.
Ce que je voulais fonctionne parce que le texte entre l'ouverture {et les deux-points, ou entre la virgule et les deux-points pour les propriétés suivantes est utilisé comme une chaîne sans guillemets pour créer une clé d'objet, ou, comme Friedo l'a dit, un nom de variable là-bas ne le fait pas ' t être interpolé:
=> ABC123
la source
Si json décrit des objets, vous obtenez en pratique ce qui suit
Donc alors,
donc même si vos exemples produisent le même résultat, leurs équivalents en "code brut" ne le feraient pas. C'est peut-être pourquoi ?? Je sais pas, juste une idée.
la source
{ bar: 'goodbye' }
ne définira pas le nom de la clé sur la valeur debar
, il le sera simplementbar
. Les autres ont raison sur la raison pour laquelle la spécification nécessite des guillemets: c'est pour éviter les conflits de mots-clés et de caractères spéciaux.Cela peut réduire la taille des données si les citations sur le nom ne sont autorisées que lorsque cela est nécessaire
la source