SyntaxError: token inesperado o en JSON en la posición 1

139

Analizo pocos datos usando una clase de tipo en mi controlador. Obtengo datos de la siguiente manera:

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

Traté de almacenar los datos así

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

¿Cómo puedo extraer la lista de usuarios a una nueva variable?

Soniya Mohan
fuente
11
Es posible que no necesite usar JSON.parse. Intenta usarlo userDatadirectamente como un objeto.
Mohit Bhardwaj
13
Si se console.log(typeof userData)muestra object, ya tiene un objeto javascript y no una cadena JSON que debe analizar.
t.niese
1
@MohitBhardwaj sí, no es necesario para el análisis ..
Soniya Mohan
55
Por lo general, cada vez que recibe este error Unexpected token o in JSON, lo más probable es que esté intentando analizar un objeto que ya está en forma analizada.
Mohit Bhardwaj
@MohitBhardwaj está bien!
Soniya Mohan

Respuestas:

191

El JSON que publicó se ve bien, sin embargo, en su código, lo más probable es que ya no sea una cadena JSON, sino un objeto JavaScript. Esto significa que no es necesario analizar más.

Puede probar esto usted mismo, por ejemplo, en la consola de 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()Convierte la entrada en una cadena. El toString()método de los objetos JavaScript por defecto devuelve [object Object], lo que resulta en el comportamiento observado.

Pruebe lo siguiente en su lugar:

var newData = userData.data.userList;
Timo
fuente
1
¿Entonces esto es aplicable para todo tipo de navegadores?
comeOnGetIt
@Timo ¿Podrías mirar este enlace?
V SH
A veces, este error puede aparecer cuando el punto final de la API que sirve a la solicitud tiene un error en su código o en algún otro archivo incluido o usado y arroja un error que no se maneja ni se anota. En su mayoría, puede obtener esto si mira la pestaña de red en las herramientas de desarrollo del navegador o puede llegar al punto final usando post man y ver lo que aparece.
MuturiAlex
65

los primeros parámetros de función JSON.parsedeben ser una Cadena, y sus datos son un objeto JavaScript, por lo que se convertirá en una Cadena [object object], debe usar JSON.stringifyantes de pasar los datos

JSON.parse(JSON.stringify(userData))
huruji
fuente
1
Gran ayudado hermano. Gracias :)
Anand_5050
Ayudó. Gracias por la solución.
Nag Arjun
Me salvaste el día hermano. Gracias :)
Dwarkesh Soni
esto no funcionará cuando la cadena contiene un doble cotización ¿tiene alguna solución
Sr. S Coder
23

Nunca lo uses JSON.parsesin envolverlo en try-catchbloque:

// 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
fuente
77
En realidad, esto no responde la pregunta, pero comenta sobre la falta de manejo de excepciones.
Richard Duerr
2
@ RichardDuerr, pero esto ayudará a corregir el error del tema principal. es decir, SyntaxError: token inesperado o en JSON en la posición 1
Niko Jojo
66
Eso simplemente oculta el error, pero en realidad no lo resuelve.
Richard Duerr
21

Justo arriba JSON.parse, use:

var newData = JSON.stringify(userData)
Sukhchain
fuente
44
JSON.stringify()convierte un objeto de JavaScript en una representación de cadena del mismo, que es lo contrario de lo que JSON.parse()hace. Obtuviste el SyntaxErrorporque estabas tratando de analizar algo que ya era un objeto. En la solución de @ Sukhchain, se convierte en una cadena para evitar eso.
Hubert
1
La desventaja de eso es que al final estás usando JSON.parse()demasiado de forma redundante. Aunque es un proceso bastante rápido, el análisis JSON se realiza de forma sincrónica y potencialmente puede bloquear su interfaz de usuario, por lo que aconsejaría no usarlo. En cambio, puede verificar si su variable es un objeto, por ejemplo, usar typeof(userData) === 'object'antes de intentar analizarlo.
Hubert
2

Bueno, quería decir que necesito para analizar objeto como éste: var jsonObj = {"first name" : "fname"}. Pero, en realidad no. Porque ya es un JSON.

М.Б.
fuente
2

También podemos agregar 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
fuente
1

Se produce un error inesperado 'O' cuando se analizan los datos JSON o String.

Si es una cadena, ya está en cadena. El análisis termina con un error 'O' inesperado.

Me enfrenté de manera similar (aunque en un contexto diferente), resolví el siguiente error al eliminar JSON Producer.

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

  }

La respuesta contiene el retorno de cadena "OK" . La anotación marcada como @Produces ({** MediaType.APPLICATION_JSON }) ** intenta analizar la cadena al formato JSON que da como resultado una 'O' inesperada .

Eliminar @Produces ({ MediaType.APPLICATION_JSON }) funciona bien. Salida: OK

Cuidado: también, en el lado del cliente, si realiza una solicitud ajax y utiliza JSON.parse ("OK"), arroja el token inesperado 'O'

O es la primera letra de la cadena

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

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

Yergalem
fuente