2012-05-23 7 views
0

Je continue à obtenir cette erreur:Vous ne pouvez pas utiliser JSON.parse sur "var temp = {'1': ...}"?

SyntaxError: Unexpected token o 

Pour un morceau de v.simple de code:

var temp = {"1":["2","1","0000-00-00 00:00:00","testing once"],"2":["2","1","0000-00-00 00:00:00","testing twice :)"]}; 

    console.log(JSON.parse(temp)); //error is here 

temp var est les données json_encoded .. mais j'obtenir cette erreur =/qu'est-ce que cela signifie je me suis trompé?

+2

' JSON.parse' prend une chaîne comme argument, tandis que 'temp' est un objet. – MaxArt

+0

Je ne suis pas vraiment sûr comment décrire cela dans un titre .... de toute façon, 'JSON.parse' convertit d'abord l'objet (connu sous le nom de' temp') en une chaîne, ce qui aboutit à "[objet ...] "ou similaire (c'est l'analyse de ce qui est affiché en faisant' console.log (temp.toString()) '). C'est cette chaîne (non-JSON) qui est ensuite tentée d'être analysée, d'où vient l'erreur de syntaxe spécifique. –

Répondre

5

Le problème ici est que ce n'est pas JSON. C'est un objet Javascript. (La syntaxe pour JSON est dérivée de celle d'un objet Javascript.) Elle n'a pas besoin d'être analysée dans un objet Javascript car il en est déjà un.

Il suffit de faire console.log(temp) et vous verrez ceci.

La raison pour laquelle vous obtenez ce message étrange est qu'essayer de faire JSON.parse sur un objet fait que Javascript tente d'abord de convertir l'objet en chaîne. La chaîne qui en résulte n'est pas utile: "[object Object]". JSON.parse tente d'analyser cela. Il fait face à [ mais tombe sur le premier o, car c'est une syntaxe JSON illégale.

+0

Ok qui l'a corrigé alors que ma boucle tourne 127 fois pour un objet avec seulement 2 clés uniques =/ comme pour (var i in temp) est 107 boucles =/ – Sir

+0

@Dave Vous devriez toujours utiliser 'hasOwnProperty' pour faire un Boucle 'for..in' pour éviter de boucler les propriétés héritées. – lonesomeday

+0

Mais cela a fonctionné correctement ici: http://jsfiddle.net/fAh75/18/ – Sir

2

JSON.parse() attend une chaîne. Vous lui passez un objet. Si vous changez votre déclaration de temp afin qu'il contient en fait une chaîne de JSON alors votre code devrait fonctionner:

var temp = '{"1":["2","1","0000-00-00 00:00:00","testing once"],"2":["2","1","0000-00-00 00:00:00","testing twice :)"]}'; 
3

Vous êtes censé passer une chaîne à JSON.parse. Dans votre exemple, vous passez un objet. Vous pouvez rechercher JSON.stringify():

var temp = {"1":["2","1","0000-00-00 00:00:00","testing once"],"2":["2","1","0000-00-00 00:00:00","testing twice :)"]} 
console.log(JSON.stringify(temp)) 
0

Vous pouvez convertir quelque chose dans un objet JSON de deux façons:

1. from a string you can use JSON.parse that is faster than eval: 

    JSON.parse ('{"key":"value"}'); 

2. from an object you can use JSON.stringify: 

    JSON.stringify ({"key":"value"}); 

Pour plus d'infos:

JSON Doc

Questions connexes