Ich erhalte immer wieder "Ungefangener SyntaxError: Unerwartetes Token o"

306

Ich versuche etwas HTML / CSS / Javascript zu lernen, also schreibe ich mir selbst ein Lehrprojekt.

Die Idee war, ein Vokabular in einer JSON-Datei zu haben, das dann in eine Tabelle geladen wird. Es gelang mir, die Datei zu laden und einen ihrer Werte auszudrucken. Danach begann ich, den Code zu schreiben, um die Werte in die Tabelle zu laden.

Danach bekam ich einen Fehler, also entfernte ich den gesamten Code, den ich geschrieben hatte, und ließ nur eine Zeile übrig (dieselbe Zeile, die zuvor funktioniert hatte) ... nur der Fehler ist noch vorhanden.

Der Fehler ist wie folgt:

Uncaught SyntaxError: Unexpected token o
(anonymous function)script.js:10
jQuery.Callbacks.firejquery-1.7.js:1064
jQuery.Callbacks.self.fireWithjquery-1.7.js:1182
donejquery-1.7.js:7454
jQuery.ajaxTransport.send.callback

Mein Javascript-Code ist in einer separaten Datei enthalten und lautet einfach wie folgt:

function loadPageIntoDiv(){
    document.getElementById("wokabWeeks").style.display = "block";
}

function loadWokab(){
    //also tried getJSON which threw the same error
    jQuery.get('wokab.json', function(data) {
        var glacier = JSON.parse(data);
    });
}

Und meine JSON-Datei hat gerade Folgendes:

[
    {
        "english": "bag",
        "kana": "kaban",
        "kanji": "K"
    },

    {
        "english": "glasses",
        "kana": "megane",
        "kanji": "M"
    }
]

Jetzt wird der Fehler in Zeile 11 gemeldet, die die var glacier = JSON.parse(data);Zeile ist.

Wenn ich die JSON-Datei entferne, wird die Fehlermeldung "GET http: //.../wokab.json 404 (Not Found)" angezeigt, damit ich weiß, dass sie geladen wird (oder zumindest versucht wird).

Björninn
quelle
5
$ .get kann json daher erkennen, wenn es gesendet wird. var glacier = data;sollte ausreichen.
Roselan
46
Fazit: Sie versuchen es zweimal zu analysieren.
Fiatjaf
Ich habe das gleiche bekommen, Uncaught SyntaxError: Unexpected token Iweil Python codiertjson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Antworten:

314

Es sieht so aus, als würde jQuery den Datentyp erraten. Es führt die JSON-Analyse durch, obwohl Sie getJSON () nicht aufrufen. Wenn Sie dann versuchen, JSON.parse () für ein Objekt aufzurufen, wird der Fehler angezeigt.

Weitere Erklärungen finden Sie in der Antwort von Aditya Mittal .

ek_ny
quelle
13
Aha, also gibt data [0] .english "bag" zurück. Sieht so aus, als müsste ich die JSON-Datei überhaupt nicht analysieren.
Björninn
1
Das ist interessant. Ich denke, JQuery schätzt den Datentyp und geht davon aus, dass es Json ist. Ich würde denken, dass getJson dann auch funktionieren würde, oder?
ek_ny
87
Kleiner Hinweis: Wenn Sie JSON.parseein Objekt haben, wird das "Unerwartete Token o" einfach ausgelöst, weil es versucht zu analysieren obj_to_parse.toString(), was ist [object Object]. Versuchen Sie es JSON.parse('[object Object]');;)
Pier Paolo Ramon
22
Es ist mir auch passiert, ich glaube mein Fehler war, dass ich versucht habe, etwas zu JSON zu analysieren, das bereits ein JSON-Objekt war
Wak
2
jQuery nicht erraten . Wenn Sie es nicht überschreiben dataType(warum auch immer), verwendet es den Content-typeHTTP-Header der Antwort, um zu bestimmen, um welche Art von Daten es sich handelt, und analysiert sie, wenn es sich um Daten handelt, die von jQuery erkannt werden.
Quentin
76

Das Problem ist sehr einfach

jQuery.get('wokab.json', function(data) {
    var glacier = JSON.parse(data);
});

Sie analysieren es zweimal. getverwendet das dataType='json', sodass die Daten bereits im JSON-Format vorliegen. Verwenden Sie $.ajax({ dataType: 'json' ...diese Option, um den zurückgegebenen Datentyp spezifisch festzulegen!

Andrius Bentkus
quelle
54

Wenn der Antwortheader text / html ist, müssen Sie ihn analysieren, und wenn der Antwortheader application / json lautet, wird er bereits für Sie analysiert.

Analysierte Daten vom JQuery Success Handler für Text- / HTML-Antworten:

var parsed = JSON.parse(data);

Analysierte Daten vom JQuery Success Handler für die Anwendungs- / JSON-Antwort:

var parsed = data;
Aditya Mittal
quelle
6
Hinweis für alle, die dies ablehnen. Die oben akzeptierte Antwort enthält eine genaue Kopie dieser Antwort. Link von akzeptierter Antwort jetzt hinzufügen.
Geoffrey Hale
11

Ein weiterer Hinweis auf Unexpected tokenFehler. Es gibt zwei Hauptunterschiede zwischen Javascript-Objekten und json:

  1. JSON-Daten müssen immer in doppelte Anführungszeichen gesetzt werden.
  2. Schlüssel müssen in Anführungszeichen gesetzt werden

Korrigieren Sie JSON

 {
    "english": "bag",
    "kana": "kaban",
    "kanji": "K"
}

Fehler JSON 1

 {
    'english': 'bag',
    'kana': 'kaban',
    'kanji': 'K'
 }

Fehler JSON 2

 {
    english: "bag",
    kana: "kaban",
    kanji: "K"
}

Anmerkung

Dies ist keine direkte Antwort auf diese Frage. Aber es ist eine Antwort auf Unexpected tokenFehler. Es kann also anderen helfen, die sich mit dieser Frage auseinandersetzen.

Matthias M.
quelle
2

Die Antwort ist einfach bereits analysiert, Sie müssen sie nicht erneut analysieren. Wenn Sie es erneut analysieren, erhalten Sie ein "unerwartetes Token o". Sie müssen jedoch in Ihrer Anfrage den Datentyp angeben, um vom Typ zu seindataType='json'

Muhammad Soliman
quelle
1

Ich hatte gerade ein ähnliches Problem und meine Lösung könnte helfen. Ich verwende einen Iframe, um eine XML-Datei hochzuladen und in JSON zu konvertieren und sie hinter den Kulissen zurückzusenden. Chrome fügte den eingehenden Daten Müll hinzu, der nur zeitweise angezeigt wurde und das "Ungefangene SyntaxError: Unerwartetes Token o" verursachte. Error.

Ich habe wie folgt auf die Iframe-Daten zugegriffen:

$('#load-file-iframe').contents().text()

Das funktionierte gut auf localhost, aber als ich es auf den Server hochlud, funktionierte es nicht mehr nur mit einigen Dateien und nur beim Laden der Dateien in einer bestimmten Reihenfolge. Ich weiß nicht wirklich, was es verursacht hat, aber das hat es behoben. Ich habe die obige Zeile in geändert

$('#load-file-iframe').contents().find('body').text()

Einmal bemerkte ich etwas Müll in der HTML-Antwort.

Lange Rede, kurzer Sinn, überprüfen Sie Ihre rohen HTML-Antwortdaten, und Sie könnten etwas auftauchen.

Brandon
quelle
OK danke. Seltsamerweise scheint es manchmal ein bereits analysiertes JSON-Objekt zu erhalten und manchmal nicht. Ich hatte keine Zeit, das Projekt fortzusetzen, daher weiß ich nicht, ob dies zufällig geschieht (abhängig von Browsern und Systemen oder etwas anderem). Danke für den Hinweis, den ich mir merken werde.
Björninn
1
SyntaxError: Unexpected token o in JSON

Dies passiert auch, wenn Sie vergessen, das awaitSchlüsselwort für eine Methode zu verwenden, die JSON-Daten zurückgibt.

Zum Beispiel:

async function returnJSONData()
{
   return "{\"prop\": 2}";
}

var json_str = returnJSONData();
var json_obj = JSON.parse(json_str);

wird wegen des Fehlens einen Fehler auslösen await. Was tatsächlich zurückgegeben wird, ist ein Promise[Objekt], kein string.

Um dies zu beheben, fügen Sie einfach "Warten" hinzu, wie Sie es sollten:

var json_str = await returnJSONData();

Dies sollte ziemlich offensichtlich sein, aber der Fehler wird aufgerufen JSON.parse, sodass es leicht zu übersehen ist, wenn zwischen Ihrem Methodenaufruf und dem Aufruf ein gewisser Abstand besteht .awaitJSON.parse

Obinwanne Hill
quelle
0

Stellen Sie sicher, dass Ihre JSON-Datei vorher oder nachher keine nachgestellten Zeichen enthält. Vielleicht eine nicht druckbare? Vielleicht möchten Sie Folgendes versuchen:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
thexebolud
quelle
1
JSON.parse ('[{"Englisch": "Tasche", "Kana": "Kaban", "Kanji": "K"}, {"Englisch": "Brille", "Kana": "Megane", " kanji ":" M "}] '); Funktioniert gut. ¿Haben Sie versucht, diese Zeile durch Warnung (Daten) zu ersetzen, um zu überprüfen, ob die Datei korrekt geladen wird?
Thexebolud
0
const getCircularReplacer = () => {
              const seen = new WeakSet();
              return (key, value) => {
                if (typeof value === "object" && value !== null) {
                  if (seen.has(value)) {
                    return;
                  }
                  seen.add(value);
                }
                return value;
              };
            };
JSON.stringify(tempActivity, getCircularReplacer());

Wenn tempActivity die Daten fummelt, die den Fehler "SyntaxError: Unerwartetes Token o in JSON an Position 1 - Stapelüberlauf" erzeugen.

VISHAL KUMAR
quelle