Continuo a ricevere "Uncaught SyntaxError: token imprevisto o"


306

Sto cercando di imparare un po 'di html / css / javascript, quindi sto scrivendo un progetto di insegnamento.

L'idea era di avere un po 'di vocabolario contenuto in un file json che sarebbe poi stato caricato in una tabella. Sono riuscito a caricare il file e stamparne uno dei suoi valori, dopo di che ho iniziato a scrivere il codice per caricare i valori nella tabella.

Dopo aver fatto ciò ho iniziato a ricevere un errore, quindi ho rimosso tutto il codice che avevo scritto, lasciandomi con una sola riga (la stessa riga che aveva funzionato in precedenza) ... solo l'errore è ancora lì.

L'errore è il seguente:

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

Il mio codice javascript è contenuto in un file separato ed è semplicemente questo:

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);
    });
}

E il mio file JSON ha appena il seguente ora:

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

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

Ora l'errore è riportato nella riga 11 che è la var glacier = JSON.parse(data);riga.

Quando rimuovo il file json ottengo l'errore: " OTTIENI http: //.../wokab.json 404 (non trovato)", quindi so che lo sta caricando (o almeno provando a).


5
$ .get è in grado di riconoscere json quando viene inviato, quindi. var glacier = data;dovrebbe bastare.
Roselan,

46
Riassumendo: stai cercando di analizzarlo due volte.
fiatjaf,


Ho ottenuto lo stesso Uncaught SyntaxError: Unexpected token Iperché Python codificajson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein il

Risposte:


314

Sembra che jQuery faccia un'ipotesi sul tipo di dati. Esegue l'analisi JSON anche se non si chiama getJSON () - quindi quando si tenta di chiamare JSON.parse () su un oggetto, viene visualizzato l'errore.

Ulteriori spiegazioni sono disponibili nella risposta di Aditya Mittal .


13
Ah, quindi data [0] .english restituisce "bag". Sembra che non debba assolutamente analizzare il file JSON.
Bjorninn,

1
è interessante .. immagino che jquery faccia un'ipotesi sul tipo di dati e supponga che sia json. Penserei che anche GetJson avrebbe funzionato, giusto?
ek_ny,

87
Piccola nota: se sei JSON.parseun oggetto il "Token inatteso o" viene lanciato semplicemente perché tenta di analizzare obj_to_parse.toString(), che è [object Object]. Prova a JSON.parse('[object Object]');;)
Pier Paolo Ramon,

22
È successo anche a me, penso che il mio errore sia stato quello di aver cercato di analizzare a JSON qualcosa che era già un oggetto JSON
Wak,

2
jQuery non indovina . Se non lo sovrascrivi con dataType(qualsiasi motivo per cui lo faresti), utilizza l' Content-typeintestazione HTTP della risposta per determinare quale tipo di dati è e lo analizza se è uno che jQuery riconosce.
Quentin,

76

Il problema è molto semplice

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

Lo stai analizzando due volte. getusa il dataType='json', quindi i dati sono già in formato json. Utilizzare $.ajax({ dataType: 'json' ...per impostare in modo specifico il tipo di dati restituito!


54

Fondamentalmente se l'intestazione della risposta è text / html devi analizzare, e se l'intestazione della risposta è application / json, è già analizzata per te.

Dati analizzati dal gestore di successo jquery per la risposta di testo / html:

var parsed = JSON.parse(data);

Dati analizzati dal gestore del successo jquery per la risposta dell'applicazione / json:

var parsed = data;

6
Nota a chiunque abbia votato in basso, la risposta accettata sopra contiene una copia esatta di questa risposta. Aggiunta del collegamento dalla risposta accettata ora.
Geoffrey Hale,

11

Un altro suggerimento per Unexpected tokenerrori. Esistono due principali differenze tra oggetti javascript e json:

  1. i dati json devono essere sempre indicati tra virgolette doppie.
  2. le chiavi devono essere quotate

JSON corretto

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

Errore JSON 1

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

Errore JSON 2

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

osservazione

Questa non è una risposta diretta a questa domanda. Ma è una risposta per Unexpected tokenerrori. Quindi potrebbe essere d'aiuto agli altri che si imbattono in questa domanda.


2

Semplicemente la risposta è già analizzata, non è necessario analizzarla di nuovo. se lo analizzi di nuovo ti darà "token imprevisto o" tuttavia devi specificare il tipo di dati nella tua richiesta per essere di tipodataType='json'


1

Ho avuto un problema simile proprio ora e la mia soluzione potrebbe aiutare. Sto usando un iframe per caricare e convertire un file xml in json e rispedirlo dietro le quinte, e Chrome stava aggiungendo un po 'di spazzatura ai dati in arrivo che si sarebbero mostrati solo in modo intermittente e causando "Uncaught SyntaxError: Unexpected token o" errore.

Stavo accedendo ai dati iframe in questo modo:

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

che ha funzionato bene su localhost, ma quando l'ho caricato sul server ha smesso di funzionare solo con alcuni file e solo durante il caricamento dei file in un determinato ordine. Non so davvero cosa l'abbia causato, ma questo l'ha risolto. Ho cambiato la riga sopra in

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

una volta ho notato della spazzatura nella risposta HTML.

Per farla breve controlla i tuoi dati di risposta HTML grezzi e potresti alzare qualcosa.


Ok grazie. Stranamente a volte sembra ricevere un oggetto json già analizzato e talvolta no. Non ho avuto il tempo di continuare il progetto, quindi non so se lo farà casualmente (a seconda dei browser e dei sistemi o qualcosa del genere). Grazie per il puntatore lo terrò a mente.
Bjorninn,

1
SyntaxError: Unexpected token o in JSON

Ciò accade anche quando si dimentica di utilizzare la awaitparola chiave per un metodo che restituisce dati JSON.

Per esempio:

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

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

genererà un errore a causa della mancanza await. Ciò che viene effettivamente restituito è un Promise[oggetto], non un string.

Per risolvere, basta aggiungere wait come dovresti:

var json_str = await returnJSONData();

Questo dovrebbe essere abbastanza ovvio, ma l'errore viene richiamato JSON.parse, quindi è facile perdere se c'è una certa distanza tra la awaitchiamata del metodo e la JSON.parsechiamata.


0

Assicurarsi che il file JSON non contenga caratteri finali prima o dopo. Forse non stampabile? Puoi provare in questo modo:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]

1
JSON.parse ( '[{ "inglese": "borsa", "kana": "Kaban", "kanji": "K"}, { "inglesi": "occhiali", "kana": "megane"," kanji ":" M "}] '); Funziona bene. ¿Hai provato a sostituire quella riga con un avviso (dati) per verificare se il file si sta caricando correttamente?
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());

Dove tempActivity sta alimentando i dati che generano l'errore "SyntaxError: token imprevisto o in JSON in posizione 1 - StackTranslate.it"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.