Les clés JSON doivent-elles être entourées de guillemets?

236

Exemple: le code suivant est-il valide par rapport à la spécification JSON ?

{
    precision: "zip"
}

Ou dois-je toujours utiliser la syntaxe suivante? (Et si oui, pourquoi?)

{
    "precision": "zip"
}

Je n'ai pas vraiment trouvé quelque chose à ce sujet dans les spécifications JSON. Bien qu'ils utilisent des guillemets autour de leurs clés dans leurs exemples.

christianvuerings
la source

Réponses:

147

Oui, vous avez besoin de guillemets. C'est pour le rendre plus simple et pour éviter d'avoir à avoir une autre méthode d'échappement pour les mots clés réservés javascript, c'est-à-dire {for:"foo"}.

cobbal
la source
12
Les citations ne sont pas plus simples dans de nombreuses situations, telles que les fichiers de configuration qui sont modifiés à la main. La chose malheureuse au sujet de JSON utilisé (et mal utilisé) comme format d'échange presque universel est qu'il a des fonctionnalités spécifiques à Javascript.
miguel
12
Vraie raison - vérifiez aussi cette réponse - stackoverflow.com/questions/4201441/…
TechMaze
3
Tl; dr: ils ne voulaient pas traiter la limitation ECMAScript sur les mots-clés réservés (sans guillemets) en tant que clés, ils ont juste exigé de citer toutes les clés.
BallpointBen
136

Vous avez raison d'utiliser des chaînes comme clé. Voici un extrait de RFC 4627 - Le type de média application / json pour la notation d'objet JavaScript (JSON)

2.2. Objets

Une structure d'objet est représentée comme une paire de crochets entourant zéro ou plusieurs paires nom / valeur (ou membres). Un nom est une chaîne . Un deux-points vient après chaque nom, séparant le nom de la valeur. Une seule virgule sépare une valeur d'un nom suivant. Les noms dans un objet DEVRAIENT être uniques.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. Cordes

La représentation des chaînes est similaire aux conventions utilisées dans la famille C des langages de programmation. Une chaîne commence et se termine par des guillemets. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Lisez l'intégralité du RFC ici .

PatrikAkerstrand
la source
11
Et pour finir la pensée, l' article 2.5 dit: A string begins and ends with quotation marks..
rakslice
13

À partir de 2.2. Objets

Une structure d'objet est représentée comme une paire de crochets entourant zéro ou plusieurs paires nom / valeur (ou membres). Un nom est une chaîne.

et à partir de 2,5. Cordes

Une chaîne commence et se termine par des guillemets.

Je dirais donc que selon la norme: oui, vous devez toujours citer la clé (même si certains analyseurs peuvent être plus indulgents)

Cebjyre
la source
7

Oui, les devis sont obligatoires. http://json.org/ dit:

string
    ""
    " chars "

la source
0

Oui, ils le font. Mais si vous en avez besoin autrement, passez à la caisse JSON5 .

JSON5 est un sur-ensemble de JSON qui permet la syntaxe ES5, notamment:

  • clés de propriété sans guillemets
  • chaînes de guillemets simples, d'échappement et multilignes
  • autres formats numériques
  • commentaires
  • espace supplémentaire

L'implémentation de référence JSON5 ( json5package npm ) fournit un JSON5objet doté de méthodes parseet stringifyd'arguments et de sémantiques identiques à l' JSONobjet intégré .

Inigo
la source
-2

Puisque vous pouvez mettre la notation pointée "parent.child" et que vous n'avez pas besoin de mettre parent ["enfant"] qui est également valide et utile, je dirais que les deux façons sont techniquement acceptables. Les analyseurs devraient tous faire très bien dans les deux sens. Si votre analyseur n'a pas besoin de guillemets sur les clés, il est probablement préférable de ne pas les mettre (économise de l'espace). Il est logique de les appeler chaînes car c'est ce qu'elles sont, et puisque les crochets vous donnent la possibilité d'utiliser des valeurs pour les touches, il est parfaitement logique de ne pas le faire. Dans Json, vous pouvez mettre ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

très bien sans problèmes, si vous avez besoin d'une valeur pour une clé et aucune citation ne fonctionnera pas, donc si ce n'est pas le cas, vous ne pouvez pas, donc vous n'aurez pas "vous n'avez pas besoin de guillemets sur les clés". Même s'il est juste de dire que ce sont techniquement des cordes. La logique et l'utilisation soutiennent le contraire. Il ne génère pas non plus officiellement l'objet {"someKey": "someValue"} pour obj dans notre exemple, exécuté à partir de la console de n'importe quel navigateur.

Maître James
la source
2
La réponse acceptée et le RFC qui définit JSON indiquent que les guillemets sont requis.
Keith Thompson
C'est vrai, mais il convient de noter que cela n'a pas besoin, logiquement. Je suppose qu'une sortie de notation d'objet JavaScript de toutes les consoles de navigateur est erronée, et nous devrions dire à quelqu'un de corriger cela. Peut-être que ce qu'une sortie de console de navigateur produit pour un objet n'est pas JSON, donc peut-être que JSON comme le définit la spécification n'est pas nécessaire ni implémenté de cette façon dans la plupart des endroits. Quoi qu'il en soit, je voulais juste faire le cas, qui regarde les faits sous un jour différent. Vraiment, peut-être que la spécification devrait être changée alors, "Les clés entre guillemets" ne sont tout simplement pas nécessaires partout où cela m'importe personnellement. (Il n'est tout simplement pas utilisé de cette façon dans la pratique.)
Master James
2
Vous mélangez trois choses différentes: JSON, littéraux d'objet JavaScript et sortie de la console des outils de développement du navigateur. Lorsque vous tapez votre objdans la console, le navigateur affiche une représentation lisible par l'homme de l'objet. Il peut l'afficher en tant que littéral d'objet (comme il l'a fait dans votre exemple), ou il peut utiliser une autre représentation, même interactive. Les littéraux d'objets JavaScript ne nécessitent pas de guillemets autour d'un nom de clé si la clé est un identifiant valide et non un mot réservé. Cependant, JSON requiert toujours des guillemets autour des noms de clés.
Michael Geary
3
Comme autres exemples, au lieu de taper objdans la console, essayez JSON.stringify(obj). Vous verrez maintenant une représentation JSON valide de l'objet, avec le nom de clé entre guillemets. Inversement, pour voir si une chaîne est du JSON valide, essayez JSON.parse(string). Si les clés ne sont pas citées, cela lèvera une exception. Par exemple, JSON.parse('{"a":"b"}')réussira, mais JSON.parse('{a:"b"}')échouera.
Michael Geary
1
OTOH, votre utilisation de var obj = {[keyName]:"someValue"};est très intéressante! Je ne savais pas que vous pouviez le faire dans un objet JavaScript littéral. Un peu de vérification montre que c'est quelque chose de nouveau dans ES6 - vous ne pouvez pas le faire dans ES5.
Michael Geary