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?


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;

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))

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

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)

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.


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 {};
}

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.