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.