SyntaxError: token inesperado em JSON na posição 1

139

Analiso alguns dados usando uma classe de tipo no meu controlador. Estou obtendo dados da seguinte maneira:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

Eu tentei armazenar os dados assim

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Como posso extrair a lista de usuários para uma nova variável?

Soniya Mohan
fonte
11
Você pode não precisar usar JSON.parse. Tente usar userDatadiretamente como um objeto.
Mohit Bhardwaj
13
Se console.log(typeof userData)shows object, você já possui um objeto javascript e não uma string JSON que precisa analisar.
t.niese
1
@MohitBhardwaj sim, necessidade não é necessário para a análise ..
Soniya Mohan
5
Normalmente, sempre que você receber esse erro - Unexpected token o in JSON, provavelmente você está tentando analisar um objeto que já está na forma analisada.
Mohit Bhardwaj
@MohitBhardwaj okay!
Soniya Mohan

Respostas:

191

O JSON que você postou parece bom, no entanto, no seu código, provavelmente não é mais uma sequência JSON, mas já é um objeto JavaScript. Isso significa que não é mais necessário analisar.

Você pode testar isso sozinho, por exemplo, no console do Chrome:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()converte a entrada em uma string. O toString()método de objetos JavaScript por padrão retorna [object Object], resultando no comportamento observado.

Tente o seguinte:

var newData = userData.data.userList;
Timo
fonte
1
Então, isso é aplicável a todos os tipos de navegadores?
comeOnGetIt 12/06
@ Timo Você pode procurar neste link.
V SH
Às vezes, esse erro pode surgir quando o ponto de extremidade da API que atende à solicitação apresenta um erro em seu código ou em algum outro arquivo incluído ou usado e gera um erro que não é tratado ou observado. Principalmente, você pode obtê-lo se olhar para a guia de rede nas ferramentas de desenvolvedor do navegador ou pode acessar o terminal usando postman e ver o que aparece.
MuturiAlex
65

os primeiros parâmetros da função JSON.parsedevem ser uma String e seus dados são um objeto JavaScript; portanto, eles serão convertidos em uma String [object object], você deve usar JSON.stringifyantes de passar os dados

JSON.parse(JSON.stringify(userData))
huruji
fonte
1
Grande ajudado mano. Obrigado :)
Anand_5050
Obrigado pela solução.
Nag Arjun
Você salvou meu dia mano. Obrigado :)
Dwarkesh Soni 12/03
isso não funcionará quando a string contiver aspas duplas. Você tem alguma solução
Mr S Coder
23

Nunca use JSON.parsesem envolvê-lo em try-catchbloco:

// payload 
let userData = null;

try {
    userDate = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result
Kousha
fonte
7
Na verdade, isso não responde à pergunta, mas comenta a falta de tratamento de exceções.
Richard Duerr 26/10
2
@ RichardDuerr, mas isso ajudará a corrigir o erro do tópico principal. ie SyntaxError: token inesperado no JSON na posição 1
Niko Jojo
6
Isso apenas oculta o erro, mas na verdade não o resolve.
Richard Duerr
21

Logo acima JSON.parse, use:

var newData = JSON.stringify(userData)
Sukhchain
fonte
4
JSON.stringify()converte um objeto JavaScript em uma representação de string dele, que é o oposto do que JSON.parse()faz. Você estava entendendo SyntaxErrorporque estava tentando analisar algo que já era um objeto. Na solução da @ Sukhchain, ela é convertida em uma string para evitar isso.
Hubert
1
A desvantagem disso é que, no final, você está usando JSON.parse()muito redundantemente. Mesmo que seja um processo bastante rápido, a análise do JSON é feita de forma síncrona e pode potencialmente bloquear sua interface do usuário, por isso aconselho a não usá-lo. Em vez disso, você pode verificar se sua variável é um objeto, por exemplo, usando typeof(userData) === 'object'antes de tentar analisá-la.
Hubert
2

Bem, eu queria dizer que eu preciso analisar objeto como este: var jsonObj = {"first name" : "fname"}. Mas, na verdade não. Porque já é um JSON.

М.Б.
fonte
2

Também podemos adicionar cheques como este:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}
Pulkit chadha
fonte
1

Um erro inesperado de 'O' é gerado quando dados JSON ou String são analisados.

Se for string, já será stringfied. A análise acaba com o erro inesperado 'O'.

Enfrentei similar (embora em contexto diferente), resolvi o seguinte erro removendo o JSON Producer.

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

A resposta contém retorno de sequência "OK" . A anotação marcada como @Produces ({** MediaType.APPLICATION_JSON }) ** tenta analisar a sequência no formato JSON, o que resulta em 'O' inesperado .

A remoção de @Produces ({ MediaType.APPLICATION_JSON }) funciona bem. Saída: OK

Cuidado: Além disso, no lado do cliente, se você fizer uma solicitação ajax e usar JSON.parse ("OK"), ele lançará o token inesperado 'O'

O é a primeira letra da string

JSON.parse (objeto) se compara com jQuery.parseJSON (objeto);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Funciona bem

Yergalem
fonte