javascript - leer - Untaught SyntaxError: Token inesperado con JSON.parse
jquery json example (15)
¿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
¿Por qué necesita JSON.parse? Ya está en una matriz de formato de objeto.
Es mejor utilizar JSON.stringify como a continuación: var b = JSON.stringify(products);
Esto puede ayudarte.
Ahora, aparentemente, /r
, /b
, /t
, /f
, etc. no son los únicos caracteres problemáticos que pueden ocasionar este error.
Tenga en cuenta que algunos navegadores pueden tener requisitos adicionales para la entrada de JSON.parse
.
Ejecute este código de prueba en su navegador:
var arr = [];
for(var x=0; x < 0xffff; ++x){
try{
JSON.parse(String.fromCharCode(0x22, x, 0x22));
}catch(e){
arr.push(x);
}
}
console.log(arr);
Probando en Chrome, veo que no permite JSON.parse(String.fromCharCode(0x22, x, 0x22));
donde x
es 34, 92, o de 0 a 31.
Los caracteres 34 y 92 son los caracteres "
y "
, respectivamente, y por lo general se esperan y se escapan correctamente. Son caracteres 0 a 31 que te darían problemas.
Para ayudar con la depuración, antes de hacer JSON.parse(input)
, primero verifique que la entrada no contenga caracteres problemáticos:
function VerifyInput(input){
for(var x=0; x<input.length; ++x){
let c = input.charCodeAt(x);
if(c >= 0 && c <= 31){
throw ''problematic character found at position '' + x;
}
}
}
Aquí hay una función que hice en base a las respuestas anteriores: funciona en mi máquina, pero YMMV.
/**
* @description Converts a string response to an array of objects.
* @param {string} string - The string you want to convert.
* @returns {array} - an array of objects.
*/
function stringToJson(input) {
var result = [];
//replace leading and trailing [], if present
input = input.replace(/^/[/,'''');
input = input.replace(//]$/,'''');
//change the delimiter to
input = input.replace(/},{/g,''};;;{'');
// preserve newlines, etc - use valid JSON
//https://.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
input = input.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 chars
input = input.replace(/[/u0000-/u0019]+/g,"");
input = input.split('';;;'');
input.forEach(function(element) {
// console.log(JSON.stringify(element));
result.push(JSON.parse(element));
}, this);
return result;
}
Cuando está utilizando el método POST o PUT, asegúrese de aplicar una secuencia en la parte del cuerpo.
He documentado un ejemplo aquí https://gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154
Digamos que sabes que es JSON válido, pero todavía estás obteniendo esto ...
En ese caso, es probable que haya caracteres ocultos / especiales en la cadena de cualquier fuente que los obtenga. Cuando pegues en un validador, se pierden, pero en la cadena todavía están allí. Esos caracteres, aunque invisibles, romperán JSON.parse()
Si s
es su JSON sin procesar, entonces límpielo 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 chars
s = s.replace(/[/u0000-/u0019]+/g,"");
var o = JSON.parse(s);
Encontré el mismo problema con JSON.parse(inputString)
.
En mi caso, la cadena de entrada proviene de la página de mi servidor [return of a page method] .
typeof(inputString)
el typeof(inputString)
- era string, aún se produce el error.
También probé JSON.stringify(inputString)
, pero no ayudó.
Más tarde descubrí que esto era un problema con el nuevo operador de línea [/n]
, dentro de un valor de campo.
Hice un reemplazo [con algún otro personaje, devolví la nueva línea después del análisis] y todo está funcionando bien.
Espero que esto ayude a alguien más.
Mi problema era que había comentado HTML en una función de devolución de llamada de PHP a través de AJAX que estaba analizando los comentarios y devolvía el JSON no válido.
Una vez que eliminé el HTML comentado, todo estaba bien y el JSON se analizó sin problemas.
JSON.parse está esperando un parámetro String in. Necesita stringificar 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
Otro error que puede dar como resultado la "SyntaxError: Unexpected token"
al llamar a JSON.parse()
está utilizando cualquiera de los siguientes en los valores de cadena:
Caracteres de nueva línea.
Pestañas (sí, pestañas que puedes producir con la tecla Tabulador)
Cualquier barra inclinada
/
(pero por alguna razón no/
, al menos no en Chrome).
(Para obtener una lista completa, consulte la sección de cadenas aquí ).
Por ejemplo, lo siguiente le dará esta excepción:
{
"msg" : {
"message": "It cannot
contain a new-line",
"description": "Some discription with a tabbed space is also bad",
"value": "It cannot have 3/4 un-escaped"
}
}
Entonces debería ser cambiado a:
{
"msg" : {
"message": "It cannot/ncontain a new-line",
"description": "Some discription with a/t/ttabbed space",
"value": "It cannot have 3//4 un-escaped"
}
}
Lo cual, debería decir, lo hace bastante ilegible en formato solo JSON con mayor cantidad de texto.
Parece que quieres stringify el objeto.
Entonces, debes usar:
JSON.stringify(products);
El motivo del error es que JSON.parse()
espera un valor de String
y products
es una Array
.
Nota: Creo que intenta json.parse(''[object Array]'')
que se queja de que no esperaba el token o
después de [
.
Use eval
. Toma la expresión / código JavaScript como una cadena y la evalúa / ejecuta.
eval(inputString);
productos es una matriz que se puede usar directamente:
var i, j;
for(i=0;i<products.length;i++)
for(j in products[i])
console.log("property name: " + j,"value: "+products[i][j]);
products
es un objeto. (creando desde un objeto literal)
JSON.parse()
se utiliza para convertir una cadena que contiene notación JSON en un objeto Javascript.
Su código convierte el objeto en una cadena (llamando a .toString()
) para intentar analizarlo como texto JSON.
El valor predeterminado .toString()
devuelve "[object Object]"
, que no es JSON válido; de ahí el error.
[
{
"name": "Pizza",
"price": "10",
"quantity": "7"
},
{
"name": "Cerveja",
"price": "12",
"quantity": "5"
},
{
"name": "Hamburguer",
"price": "10",
"quantity": "2"
},
{
"name": "Fraldas",
"price": "6",
"quantity": "2"
}
]
Aquí está tu Json perfecto que puedes analizar.
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"}]'';