2009-06-04 4 views
175

Exemple: Le code suivant est-il valide par rapport au JSON Spec?JSON Spec - est-ce que la clé doit être entourée de guillemets?

{ 
    precision: "zip" 
} 

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

{ 
    "precision": "zip" 
} 

Je n'ai pas vraiment trouvé quelque chose à ce sujet dans le cahier des charges JSON. Bien qu'ils utilisent des citations autour de leurs clés dans leurs exemples. (Donc je le ferai aussi pour l'instant)

Répondre

117

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

+8

Les guillemets ne sont pas plus simples dans de nombreuses situations, tels que les fichiers de configuration édités à la main. La chose malheureuse à propos de JSON utilisé (et mal utilisé) comme un format d'échange presque universel est qu'il a des caractéristiques spécifiques à Javascript. – miguel

+5

Véritable raison - vérifiez cette réponse aussi - http://stackoverflow.com/questions/4201441/is-there-any-practical-reason-to-use-quoted-strings-for-json-keys – TechMaze

5

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

string 
    "" 
    " chars " 
120

Vous avez raison d'utiliser des chaînes comme clé. Voici un extrait de RFC 4627 - L'application/JSON Type de support pour JavaScript Object Notation (JSON)

2,2. Objets

Une structure d'objet est représentée par une paire de accolades entourant zéro ou plusieurs paires nom/valeur (ou membres). Un nom est un chaîne. Un seul 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. Chaînes

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

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Lire toute la RFC here.

+8

Et pour finir la pensée , section 2.5 dit: 'Une chaîne commence et se termine par des guillemets. – rakslice

+0

Merci @rakslice. J'ai mis à jour la réponse – PatrikAkerstrand

+1

Dernière RFC: http://tools.ietf.org/html/rfc7159 – Necreaux

11

De 2.2. Objets

Une structure d'objet est représentée sous la forme d'une paire de parenthèses bouclées entourant zéro ou plusieurs paires nom/valeur (ou membres). Un nom est une chaîne.

et de 2.5.Chaînes

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

Je dirais donc que, selon la norme: oui, vous devriez toujours citer la clé (bien que certains parseurs peuvent être plus indulgents)

-2

Puisque vous pouvez mettre « parent.child » notation en pointillé et vous Je n'ai pas à mettre parent ["enfant"] qui est aussi valide et utile, je dirais que les deux façons sont techniquement acceptables. Les parseurs devraient tous faire les deux manières. 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 des chaînes parce que c'est ce qu'elles sont, et puisque les crochets vous donne la possibilité d'utiliser des valeurs pour les clés, il est fondamentalement logique de ne pas le faire. JSON vous pouvez mettre ...

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

>obj 
Object {someKey: "someValue"} 

très bien sans problème, si vous avez besoin d'une valeur pour une clé et aucune cité ne fonctionnera pas, si elle n'a pas, vous ne pouvez pas, donc vous ne serez pas si "vous n'avez pas besoin de citations sur les clés". Même si c'est juste de dire qu'ils sont techniquement des cordes. La logique et l'usage arguent du contraire. Il ne sort pas non plus officiellement Object {"someKey": "someValue"} pour obj dans notre exemple exécuté à partir de la console de n'importe quel navigateur.

+0

La réponse acceptée et la RFC qui définit JSON indiquent que les guillemets sont obligatoires. –

+0

C'est vrai, mais il vaut la peine de le noter, il n'a pas besoin de le faire. Je suppose qu'une sortie JavaScript Object Notation de toutes les consoles du navigateur est fausse, et nous devrions dire à quelqu'un de corriger cela. Peut-être que la sortie d'une console de navigateur pour un objet n'est pas JSON, alors peut-être que JSON, comme la spécification de définition n'est pas nécessaire, n'est pas implémenté de cette façon dans la plupart des endroits. De toute façon, je voulais juste faire l'affaire, qui regarde les faits sous un jour différent. Vraiment peut-être que la spécification devrait être changée alors, "Quotes Keys" n'est tout simplement pas nécessaire partout où cela m'importe personnellement. (Il n'est simplement pas utilisé de cette façon en pratique.) –

+0

Vous mélangez trois choses différentes: JSON, les littéraux d'objets JavaScript et la sortie de la console des outils de développement du navigateur. Lorsque vous tapez votre 'obj' dans la console, le navigateur affiche une représentation lisible par l'homme de l'objet. Il peut l'afficher comme un objet littéral (comme dans votre exemple), ou utiliser une autre représentation, même interactive. Les littéraux d'objet JavaScript n'ont pas besoin de guillemets autour d'un nom de clé si la clé est un identifiant valide et non un mot réservé. Toutefois, JSON _always_ nécessite des guillemets autour des noms de clé. –

Questions connexes