Error “Error de sintaxis no detectado: token inesperado con JSON.parse”

6 minutos de lectura

avatar de usuario
coiso

¿Qué causa este error en la tercera línea?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Abra la consola para ver el error

  • ¿No tienes ningún JSON? Es una matriz/objeto literal.

    – Bergi

    21 de enero de 2013 a las 3:41

products es un objeto (creando a partir de un objeto literal)

JSON.parse() se utiliza para convertir un cuerda que contiene notación JSON en un objeto Javascript.

Su código convierte el objeto en una cadena (llamando .toString()) para intentar analizarlo como texto JSON.
El valor por defecto .toString() devoluciones "[object Object]", que no es JSON válido; de ahí el error.

  • ¿No es una matriz? ¿Por qué es un objeto? Los objetos comienzan con { y las matrices comienzan con [? or am i false here

    – user2396641

    Sep 4, 2016 at 17:20

  • Arrays are objects; that’s what .toString() returns (as per the spec).

    – SLaks

    Sep 4, 2016 at 18:01

  • Is the solution to stringify the object first?

    – Mohammed Noureldin

    Feb 3, 2018 at 23:58

  • @MohammedNoureldin: No; the solution is to do nothing and use your object.

    – SLaks

    Feb 4, 2018 at 0:19

  • What if I get my data from a remote service using Ajax, which gives me Json response back? And I want that response to be saved in JavaScript array object?

    – Mohammed Noureldin

    Feb 4, 2018 at 0:54


user avatar
EdH

Let’s say you know it’s valid JSON, but you’re are still getting this…

In that case, it’s likely that there are hidden/special characters in the string from whatever source your getting them. When you paste into a validator, they are lost – but in the string they are still there. Those characters, while invisible, will break JSON.parse().

If s is your raw JSON, then clean it up with:

// Preserve newlines, etc. - use valid JSON
s = s.replace(/\\n/g, "\\n")
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// Remove non-printable and other non-valid JSON characters
s = s.replace(/[\u0000-\u0019]+/g,"");  var o = JSON.parse(s);

  • Obtuve un carácter especial final después de la decodificación Base64, ¡su método me ayudó mucho! Gracias

    – Guillermo

    9 de julio de 2016 a las 23:24


  • no confíe en una fuente que responda con JSON no válido. Solo infórmeles que los datos están corruptos. deberían arreglarlo. si tratas de “recuperar” la respuesta así o de forma similar, estarás manteniendo una comunicación inestable.

    – Onur Yıldırım

    14/07/2016 a las 18:34


  • Debiera ser s = s.replace(/[\u0000-\u001F]+/g,""); en vez de s = s.replace(/[\u0000-\u0019]+/g,""); , para reemplazar todos los caracteres de control. ¿Derecha?

    – Hongchao Zhang

    17/08/2016 a las 10:00

  • cual es la logica detras s.replace(/\\n/g, "\\n") Lo probé, se aplica a, por ejemplo. "abc\\ndef".replace(/\\n/g,"\\'"); lo convertiría en abc\'def ¿Por qué quieres hacer eso? ¿Json no permite terminar una línea con una barra invertida? ¿Puedes comentar un poco sobre lo que hacen tus ejemplos y por qué?

    – barlop

    28/10/2016 a las 16:44

  • Gracias, esto realmente ayuda. Especialmente cuando copia JSON al portapapeles y había caracteres finales especiales ocultos en la consola.

    – ChiHang

    25 de septiembre de 2017 a las 3:44

avatar de usuario
Onur Yıldırım

parece que quieres encadenar el objeto, no analizar. Así que haz esto:

JSON.stringify(products);

La razón del error es que JSON.parse() espera un String valor y products es un Array.

Nota: creo que intenta json.parse('[object Array]') que se queja de que no esperaba token o después [.

  • Worked for me. I stringified all array elements and array itself. Then json.parse() was successful.

    – cansu

    Aug 14, 2020 at 7:54

  • Why would you do this though? It’s already an object. Why stringify it only to parse it back to an object again?

    – Clonkex

    Aug 20, 2021 at 7:17

  • @Clonkex to write it to a file, to post as text, to print on the document, to make a string search, to persist in a database, to debug, to make fun of it and a few other reasons…

    – Onur Yıldırım

    Aug 21, 2021 at 5:07


  • My point is that you wouldn’t stringify and then immediately parse. That would be pointless (unless you’re trying to do a deep copy or something weird like that). Maybe you’re saying to replace parse with stringify, but it sounds like you’re saying to first stringify so that the parse works (which, as I say, would be pointless).

    – Clonkex

    Aug 22, 2021 at 10:47

  • I don’t know how you got “first stringify” from the answer but added “not parse” to be clear..

    – Onur Yıldırım

    Aug 23, 2021 at 4:54

user avatar
Derin

I found the same issue with JSON.parse(inputString).

In my case, the input string is coming from my server page (return of a page method).

I printed the typeof(inputString) – it was string, but still the error occurs.

I also tried JSON.stringify(inputString), but it did not help.

Later I found this to be an issue with the new line operator [\n]dentro de un valor de campo.

hice un reemplazar (con algún otro carácter, vuelva a colocar la nueva línea después del análisis) y todo funcionaba bien.

JSON.parse está esperando una cadena en el parámetro. Necesita secuenciar su objeto JSON para resolver el problema.

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

  • ¿En qué se diferencia esto de las respuestas anteriores?

    -Peter Mortensen

    8 ago a las 18:31

avatar de usuario
F1Krazy

Debe validar su cadena JSON aquí.

Una cadena JSON válida debe tener comillas dobles alrededor de las claves:

JSON.parse({"u1":1000,"u2":1100})       // will be ok

Si no hay comillas, causará un error:

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

El uso de comillas simples también provocará un error:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

  • ¿En qué se diferencia esto de las respuestas anteriores?

    -Peter Mortensen

    8 ago a las 18:31

avatar de usuario
pktangyue

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

cambiar a

products="[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]";

  • @SLaks sí, OP puede usar productos directamente. pero si quiere usar JSON.parselos argumentos deben ser una cadena.

    – pktangyue

    21 de enero de 2013 a las 3:39

  • ¿Qué debo hacer en ASP Classic porque es un comentario?

    – ceniza bhatt

    17 de julio de 2015 a las 6:05

  • @ashishbhatt puede usar “, luego cambie todos los demás” a \”

    – pktangyue

    17 de julio de 2015 a las 7:07

  • Algo como esto JSON.parse(products.replace(/'/g, '"'))

    – Programador químico

    22 de enero de 2016 a las 12:24

  • ¿Cuál es la esencia de esto? ¿Cuál es la conclusión? Responda editando (cambiando) su respuesta, no aquí en los comentarios (sin que “Editar:”, “Actualizar:” o similar: la pregunta/respuesta debería aparecer como si hubiera sido escrita hoy).

    -Peter Mortensen

    8 ago a las 18:22

¿Ha sido útil esta solución?