"undefined" is not valid JSON
Você passou undefined para o JSON.parse. Ele é convertido para a string "undefined", e o JSON não tem esse literal, então falha na posição 0. A pergunta de verdade é de onde veio esse undefined, e há só umas três respostas.
Você também pode ver isso escrito assim
- Unexpected token u in JSON at position 0
O V8 reescreveu a maior parte das suas mensagens de erro de JSON em 2022. A redação antiga ainda é o que a maioria dos resultados de busca mostra, mas nenhum runtime atual a emite.
Cole o seu JSON e veja exatamente onde ele quebra
Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo
O que realmente causa isso
Ordenados por quantas vezes cada um acaba sendo a resposta.
-
01 Uma chave de armazenamento que nunca foi definida
localStorage.getItem devolve null para uma chave que não existe, e JSON.parse(null) na verdade funciona. Mas se a string "undefined" foi gravada nessa chave em algum momento, ler de volta produz exatamente este erro, de forma permanente, até a chave ser limpa.
Quebra
localStorage.setItem('token', someUndefinedValue); // writes "undefined" JSON.parse(localStorage.getItem('token'));Funciona
const raw = localStorage.getItem('token'); const token = raw && raw !== 'undefined' ? JSON.parse(raw) : null; -
02 Um valor assíncrono não foi aguardado
Ler uma propriedade de uma promise, ou de um estado que ainda não carregou, dá undefined. O parsing roda antes de os dados chegarem.
Quebra
const data = JSON.parse(fetchUser().body);Funciona
const res = await fetchUser(); const data = JSON.parse(await res.text()); -
03 Uma propriedade que não existe
Um campo renomeado, um erro de digitação, ou uma API que mudou de formato. obj.data quando o payload usa obj.result dá undefined sem nenhum outro aviso.
Perguntas frequentes
- Por que JSON.parse(null) funciona e JSON.parse(undefined) não?
- Os dois são convertidos para string primeiro. null vira "null", que é um documento JSON válido, então faz o parsing e devolve null. undefined vira "undefined", e o JSON não tem literal nenhum para isso.
- Como limpo uma chave que guarda a string "undefined"?
- localStorage.removeItem(chave), ou proteja a leitura como mostrado acima. O valor ruim sobrevive aos recarregamentos, e é por isso que este erro costuma parecer intermitente entre máquinas.
Conserte agora
Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.
Validar um payload