2013-03-25 14 views
241

Ich habe ein Problem beim Parsen einfacher JSON-Strings. Ich habe sie auf JSONLint überprüft und es zeigt, dass sie gültig sind. Aber wenn ich versuche, sie zu analysieren, entweder JSON.parse oder die jQuery-Alternative verwendet es gibt mir den Fehler unexpected token o:Parsen von JSON mit "unerwarteter Token o" Fehler

<!doctype HTML> 
<html> 
    <head> 
    </head> 
    <body> 
    <script type="text/javascript"> 
     var cur_ques_details ={"ques_id":15,"ques_title":"jlkjlkjlkjljl"}; 
     var ques_list = JSON.parse(cur_ques_details); 

     document.write(ques_list['ques_title']); 
    </script> 
    </body> 
</html> 

Hinweis: Ich bin kodiert meine Saiten json_encode() in PHP.

Antwort

481

Ihre Daten sind bereits ein Objekt. Keine Notwendigkeit, es zu analysieren. Der Javascript-Interpreter hat es bereits für Sie analysiert.

+5

Wie erkennt man aus jquery, wenn Daten bereits ein gültiges JSON-Objekt ist? – mko

+2

@mko: In diesem Fall nicht. Du weißt es ist oder du nicht. Schau es dir an und schau, ob es der JSON-Spezifikation entspricht. –

+3

@DarkFalcon ich ging mit if (typeof data == 'object') {dostuff} zu prüfen, ob es ein Json-Objekt oder nur eine einfache Zeichenfolge ist – mko

9

cur_ques_details ist bereits ein JS-Objekt, die Sie nicht analysieren müssen, um es

+6

Es gibt nicht so etwas wie ein "JSON-Objekt". JSON ist eine Zeichenfolge. Was du meinst, ist ein "JS-Objekt". – Joseph

+2

Ich denke, was er meinte, ist "Javascript Objekt" – raffi

9

Die Quelle Ihres Fehlers ist jedoch, dass Sie die vollständige JSON-Zeichenfolge in Anführungszeichen setzen müssen. Im Folgenden wird fix Ihre Probe:

<!doctype HTML> 
<html> 
    <head> 
    </head> 
    <body> 
     <script type="text/javascript"> 
      var cur_ques_details ='{"ques_id":"15","ques_title":"jlkjlkjlkjljl"}'; 
      var ques_list = JSON.parse(cur_ques_details); 
      document.write(ques_list['ques_title']); 
     </script> 
    </body> 
</html> 

Wie die anderen Befragten erwähnt haben, ist das Objekt bereits in eine JS-Objekt analysiert, so dass Sie es nicht analysieren müssen. Um zu zeigen, wie die gleiche Sache zu erreichen, ohne das Parsen, können Sie wie folgt vorgehen:

<!doctype HTML> 
<html> 
<head> 
</head> 
    <body> 
     <script type="text/javascript"> 
      var cur_ques_details ={"ques_id":"15","ques_title":"jlkjlkjlkjljl"}; 
      document.write(cur_ques_details.ques_title); 
     </script> 
    </body> 
</html> 
4

Antwort ist bereits analysiert, müssen Sie es nicht erneut zu analysieren. Wenn Sie es erneut analysieren, erhalten Sie "unexpected token o". wenn Sie es als String erhalten müssen, können Sie JSON.stringify()

4

verwende ich hatte das gleiche Problem, wenn ich Daten mit jQuery AJAX vorgelegt:

$.ajax({ 
    url:... 
    success:function(data){ 
     //server response's data is JSON 
     //I use jQuery's parseJSON method 
     $.parseJSON(data);//it's ERROR 
    } 
}); 

Wenn die Antwort JSON, und Sie diese Methode verwenden, die Daten, die Sie erhalten, sind ein JavaScript-Objekt, aber wenn Sie dataType:"text" verwenden, sind Daten eine JSON-Zeichenfolge. Dann ist die Verwendung von $.parseJSON in Ordnung.

0

ich diese unexpected token o Fehler sah, weil mein (unvollständig) Code vorher gelaufen war (live neu laden!) Und den besonderen Schlüssel lokalen Speicherwert [object Object] statt {} gesetzt. Erst als ich den Schlüssel wechselte, funktionierten die Dinge wie erwartet. Alternativ können Sie these instructions to delete the incorrectly set localStorage value folgen.

5

Mit JSON.stringify(data);:

$.ajax({ 
    url: ... 
    success:function(data){ 
     JSON.stringify(data); //to string 
     alert(data.you_value); //to view you pop up 
    } 
}); 
+0

Wenn Sie einfach 'JSON.stringify' aufrufen, wird nichts mit Ihren Daten gemacht, die Funktion gibt Ihre _now_ serialisierten Daten zurück. –

43

Versuchen analysieren so:

var yourval = jQuery.parseJSON(JSON.stringify(data)); 
+0

Das funktionierte für mich zum Debuggen. Danke vielmals. Mir wurde klar, dass ich extra unnötige Informationen von meinem Controller ausspuckte. – Pathros