"[object Object]" is not valid JSON
O JSON.parse espera uma string. Quando você entrega um objeto, o JavaScript converte esse objeto para string primeiro, e a conversão padrão produz o texto literal "[object Object]". Aí o parser falha na letra o da posição 1. Os dados estão bem; a chamada de parse é que está sobrando.
Você também pode ver isso escrito assim
- Unexpected token o in JSON at position 1
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 O valor já tinha sido parseado
axios, jQuery.ajax e muitos clientes de API fazem o parsing do JSON por você quando o Content-Type indica isso. Parsear o resultado de novo é o que dispara este erro.
Quebra
const res = await axios.get('/api/user'); const user = JSON.parse(res.data); // res.data is already an objectFunciona
const res = await axios.get('/api/user'); const user = res.data; -
02 Um objeto foi guardado sem stringify
localStorage e sessionStorage guardam strings. Passar um objeto chama String(obj), o que grava o texto literal "[object Object]". Nesse ponto os dados se foram, não é que estejam apenas ilegíveis.
Quebra
localStorage.setItem('user', user); const back = JSON.parse(localStorage.getItem('user'));Funciona
localStorage.setItem('user', JSON.stringify(user)); const back = JSON.parse(localStorage.getItem('user')); -
03 Um objeto foi interpolado em um template string
Montar o corpo de uma requisição com `{"user": ${user}}` insere "[object Object]" em vez do objeto. Monte o objeto e aplique stringify no conjunto todo.
Quebra
body: `{"user": ${user}}`Funciona
body: JSON.stringify({ user })
Perguntas frequentes
- O que aconteceu com "Unexpected token o in JSON at position 1"?
- Era a redação do V8 anterior a 2022 para o mesmo engano. O o era o segundo caractere da string "[object Object]". A mensagem moderna cita o texto problemático no lugar, o que é bem mais útil.
- Como deixo isso defensivo?
- typeof value === "string" ? JSON.parse(value) : value. É uma proteção razoável em uma fronteira que você não controla, embora dentro do seu próprio código seja melhor saber qual dos dois você tem.
Conserte agora
Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.
Inspecionar um payload