2013-10-08 21 views
39

Ich habe Probleme mit JSON, das von einem Webdienst zurückgegeben wird. Es sieht so aus, als ob der JSON keine Anführungszeichen enthält, aber wenn ich dem JSON Zitate hinzufüge, erhalte ich einen Fehler. Hier ist die Fehlermeldung: 'Uncaught SyntaxError: Unexpected Token o. Wenn ich die Zeichenfolge log zu trösten: [object Object], [object Object]JSON.Parse, 'Uncaught SyntaxError: Unerwartetes Token 0

Hier einige Beispiel-Code, der den Fehler simuliert:

//Error I am trying to solve 
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 
var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + '</li>').appendTo($grouplist); 
    }); 
}); 

Hier ist der gleiche Code ist mit den einfachen Anführungszeichen um die Zeichenfolge . Es funktioniert

//Successful Javascript 
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 
var myData = JSON.parse(jsonString); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + '</li>').appendTo($grouplist); 
    }); 
}); 

//Successful HTML 
<ul id="groups"></ul> 

Aber wenn ich versuche Anführungszeichen in die Zeichenfolge zu schreiben, die ich in meinem echten Code zu brauchen scheinen, es scheitert:

//Does not work when I need to append quotes to the string: 
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 
jsonStringQuotes = "'" + jsonStringNoQuotes + "'"; 
var myData = JSON.parse(jsonStringQuotes); 

$(document).ready(function() { 
    var $grouplist = $('#groups'); 
    $.each(myData, function() { 
     $('<li>' + this.Name + ',' + this.Id + '</li>').appendTo($grouplist); 
    }); 
}); 

Hier ist der Fehler: Protokoll Zeichenfolge console: [Objekt Objekt], [Objekt Objekt] data.js: 809 Uncaught SyntaxError: Unerwartetes Token '

Ich bin ratlos. Jede Hilfe wird geschätzt! Vielen Dank!

+0

Jaon PARST nehmen Zeichenkette als Parameter –

+0

sicherlich Dieser Code-Schnipsel zu einem Fehler, aber ich denke, Sie an der falschen Sache suchen. Können Sie den Code posten, der die JSON-Zeichenfolge vom Server abruft? –

+0

Ihr erstes Codebeispiel simuliert das Problem nicht. Um was genau bitten Sie? Dein letzter ist definitiv falsch. – user2736012

Antwort

64

Ohne einfache Anführungszeichen erstellen Sie ein Array mit zwei Objekten darin. Dies ist die eigene Syntax von JavaScript. Wenn Sie die Anführungszeichen hinzufügen, ist dieses Objekt (Array + 2 Objekte) jetzt eine Zeichenfolge. Sie können JSON.parse verwenden, um eine Zeichenfolge in ein JavaScript-Objekt zu konvertieren. Sie können JSON.parse nicht verwenden, um ein JavaScript-Objekt in ein JavaScript-Objekt zu konvertieren.

//String - you can use JSON.parse on it 
var jsonStringNoQuotes = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]'; 

//Already a javascript object - you cannot use JSON.parse on it 
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 

Darüber hinaus schlägt das letzte Beispiel fehl, weil Sie der JSON-Zeichenfolge literale einfache Anführungszeichen hinzufügen. Das ist illegal. Die JSON-Spezifikation besagt, dass nur doppelte Anführungszeichen zulässig sind. Wenn Sie console.log waren die folgenden ...

console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'"); 
//Logs: 
'[object Object],[object Object]' 

Sie würden sehen, dass es die Stringdarstellung des Arrays zurückgibt, die auf eine durch Kommata getrennte Liste umgewandelt wird, und jeder Listeneintrag würde die String-Darstellung eines sein Objekt, das ist [object Object]. Denken Sie daran, dass assoziative Arrays in Javascript einfach Objekte sind, bei denen jedes Schlüssel/Wert-Paar eine Eigenschaft/Wert ist.

Warum passiert das? Da Sie mit einer Zeichenfolge "'" beginnen, versuchen Sie dann, das Array an es anzuhängen, das die Zeichenfolgendarstellung von es anfordert, dann fügen Sie eine andere Zeichenfolge "'" an.

Bitte verwechseln Sie JSON nicht mit Javascript, da es sich um völlig unterschiedliche Dinge handelt. JSON ist ein Datenformat, das für Menschen lesbar ist und der Syntax entsprechen sollte, die beim Erstellen von JavaScript-Objekten verwendet wird. JSON ist eine Zeichenfolge. Javascript Objekte sind nicht, und daher, wenn sie in Code deklariert sind nicht in Anführungszeichen umgeben.

Sehen Sie diese Geige: http://jsfiddle.net/NrnK5/

+0

Ich habe an diesem gleichen Problem für Stunden gearbeitet. Danke für die Information. –

+1

Ich hatte Schwierigkeiten, die einfachen Anführungszeichen zu meiner JSON-Zeichenfolge hinzuzufügen, weil sie in einem Datenattribut enthalten war. Ich habe es gelöst, indem ich eine JSON.stringify gemacht habe, bevor ich eine JSON.parse gemacht habe. – arrow

+0

Genau wie die Leute hier, ich habe eine Stunde damit verbracht, herumzulaufen und dann endlich diese einfache, klare Erklärung gefunden, danke! –

1

Ihr letztes Beispiel ist ein ungültiger JSON. Einfache Anführungszeichen sind in JSON nur in Strings zulässig. Im zweiten Beispiel befinden sich die einfachen Anführungszeichen nicht in der Zeichenfolge, sondern dienen dazu, den Anfang und das Ende anzuzeigen.

Siehe http://www.json.org/ für die Spezifikationen.

Sollte hinzufügen: Warum denkst du das: "wie ich scheinen muss, um in meinem echten Code"? Dann können wir Ihnen vielleicht helfen, die Lösung zu finden.

2
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 

es wird json Objekt erstellen. keine Notwendigkeit zu analysieren.

jsonStringQuotes = "'" + jsonStringNoQuotes + "'"; 

zurückkehren wird '[object]'

das ist, warum es (unten) verursacht Fehler

var myData = JSON.parse(jsonStringQuotes); 
+1

Ich glaube nicht, dass das Wrapping von Arrays in einfache Anführungszeichen ein String-Literal dieses Arrays liefert. Es wird Ihnen eher etwas wie "[Objekt], [Objekt]" geben, was offensichtlich keinen Sinn ergibt. Verwende 'JSON.Stringify'. – volpav

+0

das ist, was ich sage .. bitte lesen Sie meine Antwort wieder –

+0

Sorry, ich vermisste "Nein" in "keine Notwendigkeit zu analysieren" (am frühen Morgen hier). Sie sollten wahrscheinlich die Ausgabe von "[object]" korrigieren, da dies nicht die Art und Weise ist, wie dieses bestimmte Array dargestellt wird (Entschuldigung dafür, pedantisch zu sein, aber es wird es den Leuten leichter machen, Ihre Lösung zu verstehen, wenn das, was Sie schreiben, tatsächlich das ist kann sich selbst entdecken). – volpav

1

Vielleicht was vom Server kommt, wird bereits als JSON-Objekt ausgewertet? Zum Beispiel mit jQuery get Methode:

$.get('/service', function(data) { 
    var obj = data; 

     /* 
     "obj" is evaluated at this point if server responded 
     with "application/json" or similar. 
     */ 
     for (var i = 0; i < obj.length; i++) { 
     console.log(obj[i].Name); 
     } 
    }); 

Alternativ, wenn Sie JSON-Objekt in JSON Stringliteral drehen müssen, können Sie JSON.stringify verwenden:

var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]; 
var jsonString = JSON.stringify(json); 

Aber in diesem Fall verstehe ich nicht, warum Sie können nicht einfach die json Variable nehmen und sich darauf beziehen, anstatt zu stringieren und zu parsen.

+0

@ user3754676 Ihr JSON ist möglicherweise nicht gültig (z. B. fehlende Anführungszeichen). Sie können es überprüfen mit http://jsonlint.com – volpav

Verwandte Themen