Eu continuo recebendo "Untaught SyntaxError: token inesperado o"

306

Estou tentando aprender alguns html / css / javascript, então estou escrevendo para mim mesmo um projeto de ensino.

A idéia era ter algum vocabulário contido em um arquivo json que seria carregado em uma tabela. Consegui carregar o arquivo e imprimir um de seus valores, após o qual comecei a escrever o código para carregar os valores na tabela.

Depois disso, comecei a receber um erro, então removi todo o código que havia escrito, deixando-me apenas uma linha (a mesma linha que havia funcionado antes) ... apenas o erro ainda está lá.

O erro é o seguinte:

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

Meu código javascript está contido em um arquivo separado e é simplesmente este:

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 meu arquivo JSON tem o seguinte agora:

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

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

Agora, o erro é relatado na linha 11, que é a var glacier = JSON.parse(data);linha.

Quando removo o arquivo json, recebo o erro: "GET http: //.../wokab.json 404 (Não encontrado)", então eu sei que ele está carregando (ou pelo menos tentando).

Bjorninn
fonte
5
$ .get pode reconhecer json quando enviado, portanto. var glacier = data;deve ser suficiente.
roselan
46
Resumindo: você está tentando analisá-lo duas vezes.
Fiatjaf 31/05
Veja também stackoverflow.com/a/42907459/632951
Pacerier
Eu tenho os semelhantes Uncaught SyntaxError: Unexpected token Ipois o Python codificajson.dumps([float('inf'),float('nan')]) == '[Infinity, NaN]'
Bob Stein

Respostas:

314

Parece que o jQuery adivinha o tipo de dados. Ele faz a análise JSON, mesmo que você não esteja chamando getJSON () - quando você tenta chamar JSON.parse () em um objeto, está recebendo o erro.

Mais explicações podem ser encontradas na resposta de Aditya Mittal .

ek_ny
fonte
13
Ah, então data [0] .english retorna "bag". Parece que não preciso analisar o arquivo json.
Bjorninn
1
isso é interessante .. Eu acho que o jquery adivinha o tipo de dados e assume que é json. Eu acho que o getJson também funcionaria, certo?
ek_ny
87
Nota pequena: se você for JSON.parseum objeto, o "token inesperado o" será lançado simplesmente porque ele tenta analisar obj_to_parse.toString(), o que é [object Object]. Tente JSON.parse('[object Object]');;)
Pier Paolo Ramon
22
Também aconteceu comigo, acho que o meu erro foi tentar analisar o JSON algo que já era um objeto JSON
Wak
2
O jQuery não adivinha . Se você não substituí-lo por dataType(por que você faria), ele usa o Content-typecabeçalho HTTP da resposta para determinar que tipo de dados são e o analisa se é um que o jQuery reconhece.
Quentin
76

O problema é muito simples

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

Você está analisando duas vezes. getusa o dataType='json', então os dados já estão no formato json. Use $.ajax({ dataType: 'json' ...para definir especificamente o tipo de dados retornado!

Andrius Bentkus
fonte
54

Basicamente, se o cabeçalho da resposta for text / html, você precisará analisar e, se o cabeçalho da resposta for application / json, ele já será analisado.

Dados analisados ​​do manipulador de sucesso jquery para resposta de texto / html:

var parsed = JSON.parse(data);

Dados analisados ​​do manipulador de sucesso jquery para resposta do aplicativo / json:

var parsed = data;
Aditya Mittal
fonte
6
Observe que qualquer pessoa que vote isso abaixo, a resposta aceita acima contém cópia exata dessa resposta. Adicionando link da resposta aceita agora.
Geoffrey Hale
11

Outra dica para Unexpected tokenerros. Existem duas diferenças principais entre objetos javascript e json:

  1. Os dados json devem ser sempre citados com aspas duplas.
  2. chaves devem ser citadas

JSON correto

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

Erro JSON 1

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

Erro JSON 2

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

Observação

Esta não é uma resposta direta para essa pergunta. Mas é uma resposta para Unexpected tokenerros. Portanto, pode ajudar outras pessoas que se deparam com essa pergunta.

Matthias M
fonte
2

Simplesmente a resposta já está analisada, você não precisa analisá-la novamente. se você analisá-lo novamente, ele fornecerá "token inesperado o"; no entanto, você precisará especificar o tipo de dados na sua solicitação para ser do tipodataType='json'

Muhammad Soliman
fonte
1

Eu tive um problema semelhante agora e minha solução pode ajudar. Estou usando um iframe para fazer upload e converter um arquivo xml para json e enviá-lo de volta aos bastidores, e o Chrome estava adicionando um pouco de lixo aos dados recebidos, que só apareciam intermitentemente e causavam o "Untaught SyntaxError: token inesperado". erro.

Eu estava acessando os dados iframe assim:

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

que funcionou bem no host local, mas quando o enviei para o servidor, ele parou de funcionar apenas com alguns arquivos e apenas ao carregar os arquivos em uma determinada ordem. Eu realmente não sei o que causou, mas isso corrigiu. Eu mudei a linha acima para

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

uma vez notei algum lixo na resposta HTML.

Para encurtar a história, verifique seus dados de resposta HTML brutos e você poderá descobrir algo.

Brandon
fonte
OK obrigado. Estranhamente, às vezes parece receber um objeto json já analisado e às vezes não. Não tive tempo de continuar o projeto, por isso não sei se o fará aleatoriamente (dependendo de navegadores e sistemas ou algo assim). Obrigado pelo ponteiro, vou manter isso em mente.
precisa saber é o seguinte
1
SyntaxError: Unexpected token o in JSON

Isso também acontece quando você esquece de usar a awaitpalavra - chave para um método que retorna dados JSON.

Por exemplo:

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

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

irá lançar um erro devido à falta await. O que realmente é retornado é um Promise[objeto], não um string.

Para corrigir, basta adicionar aguardar como você deve:

var json_str = await returnJSONData();

Isso deve ser bastante óbvio, mas o erro é invocado JSON.parse, por isso é fácil perder se houver alguma distância entre sua awaitchamada de método e a JSON.parsechamada.

Obinwanne Hill
fonte
0

Verifique se o arquivo JSON não possui caracteres finais antes ou depois. Talvez um imprimível? Você pode tentar desta maneira:

[{"english":"bag","kana":"kaban","kanji":"K"},{"english":"glasses","kana":"megane","kanji":"M"}]
thexebolud
fonte
1
JSON.parse ('[{"english": "bag", "kana": "kaban", "kanji": "K"}, {"english": "glasses", "kana": "megane", " kanji ":" M "}] '); Funciona bem. ¿Você tentou substituir essa linha por alerta (dados) para verificar se o arquivo está carregando corretamente?
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());

Onde tempActivity está localizando os dados que produzem o erro "SyntaxError: token inesperado o no JSON na posição 1 - Stack Overflow"

VISHAL KUMAR
fonte