2008-12-19 6 views
26

Quelle est la syntaxe correcte pour créer des objets en javascript qui fonctionnent sur la plupart des navigateurs web (je veux dire: IE 6+, Firefox 2+, Opera 9+)syntaxe JSON pour les noms de propriété

Est cette valide


var a={ "class": "Person", 
     "name": "William Shakespeare", 
     "birthday": -12802392000000, 
     "nickname": "Bill" 
     } ; 

Ou est-ce:


var a={ class: "Person", 
     name: "William Shakespeare", 
     birthday: -12802392000000, 
     nickname: "Bill" 
     } ; 

Et quelle est la différence entre les deux?

Répondre

30

@AndreasN is correct: le JSON specification dicte l'utilisation de guillemets pour qu'il soit réellement JSON. Si vous n'utilisez pas de guillemets, il peut s'agir d'un littéral d'objet valide en Javascript, mais ce n'est pas JSON. D'autres services que Javascript utilisent JSON (par exemple, webservices utilisant php, Java, etc.) et si vous construisez une chaîne sans guillemets, il n'y a aucune garantie qu'elle sera correctement analysée - même si je pense que la plupart des implémentations seront assez robuste pour le faire.

FYI il est dangereux en Javascript d'utiliser directement eval() sur les chaînes JSON à partir de sources dont vous ne pouvez pas empêcher les attaques malveillantes. Encore une fois, voir le JSON site qui donne plus d'une explication ainsi qu'un très court fichier javascript qui analyse en toute sécurité les chaînes JSON dans les objets Javascript.

modifier: Je suppose que techniquement votre question initiale est pas JSON mais la syntaxe de Javascript pour littéraux objet. La différence est que les objets constructible d'une chaîne JSON exclura beaucoup d'autres objets littéraux possibles, par exemple:

var a = {cat: "meow", dog: "woof"}; 
var aname = {cat: "Garfield", dog: "Odie"}; 
var b = { 
    counter: 0, 
    pow: function(x) { return x+1; }, 
    zap: function(y) { return (counter += y); } 
}; 
var c = { 
    all: [a,aname], 
    animals: a, 
    names: aname, 
}; 

objet littéraux « a » et « aname » peut être exprimé en JSON (en ajoutant des guillemets pour les noms de propriétés) . Mais les littéraux d'objet "b" et "c" ne le peuvent pas. Le littéral d'objet "b" contient des fonctions (non autorisées dans JSON). Le littéral d'objet "c" ci-dessus contient des références à d'autres variables d'une manière qui n'est pas représentable dans JSON car certaines références sont partagées. Si vous modifiez c.names, il changera également c.all[1] car ils partagent une référence à la même variable. JSON peut uniquement exprimer des objets ayant une structure arborescente (par exemple, chaque sous-élément de l'objet global est indépendant).

7

Le spec dit d'utiliser "".

Firefox accepte sans, mais IE ne le fait pas.

Paire est défini comme

string : value 

La valeur peut être une chaîne chaîne est définie comme

" chars " 
+0

IE le fait aussi bien. Même IE6 l'accepte. – Tomalak

+0

ouais, je n'ai pas remarqué de problèmes avec la méthode non cotée – nickf

4

Vous devez utiliser « guillemets » autour de propriétés qui contiennent autre chose que des caractères de mot

{foo-bar: 3} // invalid 
{"foo-bar": 3} // valid 

À part cela, il n'y a pas de différence entre les deux et j'imagine que les deux façons fonctionnent dans tous les navigateurs

8

Si IE échoue avec votre deuxième exemple, c'est parce que 'Class' est un mot réservé (seulement dans IE). En règle générale, il est toujours préférable d'inclure vos noms de propriété avec des guillemets - ce qui signifie que cela fonctionnera TOUJOURS, quelle que soit la circonstance.

+2

classe est en fait un mot réservé dans tous les navigateurs. C'est juste que IE décide d'échouer quand il est utilisé. – Triptych

Questions connexes