javascript - Error "Uncaught SyntaxError: token inesperado con JSON.parse"
¿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 oAbre la consola para ver el error
Respuesta #1
products es un objeto. (creando a partir de un literal de objeto)
JSON.parse() se utiliza para convertir una cadena que contiene notación JSON en un objeto de Javascript.
Tu código convierte el objeto en una cadena (llamando a .toString()) para intentar analizarlo como texto JSON.
El .toString() predeterminado devuelve "[object Object]", lo cual no es JSON válido; de ahí el error.
Respuesta #2
Digamos que sabes que es JSON válido, pero aún así estás recibiendo esto...
En ese caso, es probable que haya caracteres ocultos/especiales en la cadena proveniente de cualquier fuente de la que los estés obteniendo. Cuando los pegas en un validador, se pierden, pero en la cadena todavía están presentes. Esos caracteres, aunque invisibles, romperán JSON.parse().
Si s es tu JSON sin procesar, entonces límpialo con:
// 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-\u001F]+/g,"");
var o = JSON.parse(s);
Actualizado una década después: el rango de control es \u0000-\u001F - fijo...
La especificación formal está aquí: https://www.json.org/json-en.html La razón por la que conservamos los espacios en blanco y otros caracteres es que la especificación lo permite y asegura que tu carácter de espacio en blanco se codifique correctamente.
¿Deberías aceptar JSON inválido? Depende de ti. Pero a veces tenemos trabajo que hacer y queremos seguir adelante.
Respuesta #3
Parece que quieres convertir a cadena el objeto, no analizarlo. Así que haz esto:
JSON.stringify(products);
La razón del error es que JSON.parse() espera un valor de String y products es un Array.
Nota: Creo que intenta json.parse('[object Array]'), lo cual se queja de que no esperaba el token o después de [.
Respuesta #4
JSON.parse está esperando una cadena en el parámetro. Necesitas convertir tu objeto JSON en una cadena 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
Respuesta #5
Encontré el mismo problema con JSON.parse(inputString).
En mi caso, la cadena de entrada proviene de mi página del servidor (retorno de un método de página).
Imprimí el typeof(inputString) - era string, pero aún así ocurre el error.
También intenté JSON.stringify(inputString), pero no ayudó.
Más tarde descubrí que esto era un problema con el operador de nueva línea [\n], dentro del valor de un campo.
Hice un reemplazo (con algún otro carácter, vuelve a poner la nueva línea después de analizar) y todo estaba funcionando bien.
Respuesta #6
Deberías validar tu 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
Usar comillas simples también causará un error:
JSON.parse({'u1':1000,'u2':1100})
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
Respuesta #7
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"}]';
