SyntaxError no capturado: token inesperado con JSON.parse

192

¿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

coiso
fuente
16
¿No tienes ningún JSON? Es una matriz / objeto literal.
Bergi

Respuestas:

220

productsEs un objeto. (creando a partir de un objeto literal)

JSON.parse()se usa para convertir una cadena que contiene notación JSON en un objeto Javascript.

Su código convierte el objeto en una cadena (mediante una llamada .toString()) para intentar analizarlo como texto JSON.
El valor predeterminado .toString()devuelve "[object Object]", que no es JSON válido; De ahí el error.

SLaks
fuente
1
¿No es una matriz? ¿Por qué es un objeto? Los objetos comienzan con {y las matrices comienzan con [? o soy falso aquí
44
Las matrices son objetos; eso es lo que .toString()regresa (según la especificación).
SLaks
1
¿Es la solución para stringificar el objeto primero?
Mohammed Noureldin
66
@MohammedNoureldin: No; La solución es no hacer nada y usar su objeto.
Habla
2
¿Qué sucede si obtengo mis datos de un servicio remoto usando Ajax, que me devuelve la respuesta de Json? ¿Y quiero que esa respuesta se guarde en el objeto de matriz de JavaScript?
Mohammed Noureldin
125

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 pega en un validador, se pierden, pero en la cadena todavía están allí. Esos caracteres, aunque invisibles, se romperánJSON.parse()

Si ses su JSON sin procesar, 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);
EdH
fuente
Estaba recibiendo el error y lo rastreé hasta un personaje extraño en una cadena. Usé su método para eliminar los caracteres JSON no válidos y funcionó.
albertski
1
He venido aquí dos veces ahora. thnx
Benjamin Hoffman
Obtuve un carácter especial final después de la decodificación Base64, ¡su método me ayudó mucho! Thx
Guillaume
no confíes en una fuente que responda con JSON no válido. Simplemente infórmeles que los datos están corruptos. deberían arreglarlo. Si intenta "recuperar" la respuesta de esta manera o de manera similar, mantendrá una comunicación inestable.
Onur Yıldırım
Debería ser en s = s.replace(/[\u0000-\u001F]+/g,""); lugar de s = s.replace(/[\u0000-\u0019]+/g,""); , para reemplazar todos los caracteres de control. ¿Correcto?
HongchaoZhang
64

Parece que quieres stringificar el objeto. Entonces haz esto:

JSON.stringify(products);

La razón del error es que JSON.parse()espera un Stringvalor y productses un Array.

Nota: Creo que intenta lo json.parse('[object Array]')que se queja de que no esperaba token odespués [.

Onur Yıldırım
fuente
28

Encontré el mismo problema con JSON.parse(inputString).

En mi caso, la cadena de entrada proviene de la página de mi servidor [devolución de un método de página] .

Imprimí el typeof(inputString)- era una cadena, aún se produce el error.

También lo intenté 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, volví a colocar la nueva línea después del análisis] y todo funciona bien.

Derin
fuente
2
El nuevo carácter de línea también fue mi problema. Entonces, ¿cómo podemos restaurar esos datos?
kolenda
@kolenda Tienes un JSON no válido. Debe cambiar su servidor para usar un serializador JSON real que devuelva un JSON válido.
Fugas
Tuve un problema similar pero en lugar de "\ n" tuve un "\ e" dentro de una ruta (cambié el código del lado del servidor para usar "/" en lugar de "\" y todo estaba funcionando nuevamente)
Adam Tal
use un escape en el que \ n sería \\ n
Paul Gregoire
14

JSON.parse está esperando un String en el parámetro. 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
Térence
fuente
12
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"}]';
pktangyue
fuente
2
@SLaks sí, OP puede usar productos directamente. pero si quiere usarlo JSON.parse, los argumentos deben ser una cadena.
pktangyue
¿Qué debo hacer en ASP Classic porque 'es un comentario
Ashish Bhatt
1
@ashishbhatt puede usar ", luego cambie todos los demás" a \ "
pktangyue
2
Algo como estoJSON.parse(products.replace(/'/g, '"'))
Programador químico
11

Debe validar su cadena JSON aquí .

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

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 causará un error:

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1
hoogw
fuente
En mi caso, Grails 2.5.6 se representa render ([key: value])con comillas simples, lo que lleva al JSON parseError en la posición 1 en jquery Ajax. render (groovy.json.JsonOutput.toJson ([key:value]))me ayudó
philburns
3
[
  {
    "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.

San
fuente
3

Aquí hay una función que hice en base a 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
              ///programming/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;
            }
tmurphree
fuente
2

Otro problema que puede resultar en una "SyntaxError: Unexpected token"excepción cuando se llama JSON.parse()está usando cualquiera de los siguientes en los valores de cadena:

  1. Personajes de nueva línea.

  2. Pestañas (¡sí, pestañas que puedes producir con la tecla Tab!)

  3. Cualquier barra independiente \(pero por alguna razón no /, al menos no en Chrome).

(Para una lista completa vea el sección Cadena 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"
    }
}

Por lo tanto, debe cambiarse 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, debo decir, lo hace bastante ilegible en formato solo JSON con una mayor cantidad de texto.

c00000fd
fuente
1

Esperemos que esto ayude a alguien más.

Mi problema fue que había comentado HTML en una función de devolución de llamada PHP a través de AJAX que estaba analizando los comentarios y devolvía JSON no válido.

Una vez que eliminé el HTML comentado, todo estuvo bien y el JSON se analizó sin problemas.

Chris
fuente
0

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]);
ic3b3rg
fuente
0

Ahora, aparentemente \r, \b, \t,\f , etc, no son los caracteres problemáticos única que le puede dar este error.

Tenga en cuenta que algunos navegadores pueden tener requisitos adicionales para la entrada deJSON.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);

Al probar en Chrome, veo que no permite JSON.parse(String.fromCharCode(0x22, x, 0x22));dóndex está 34, 92 o de 0 a 31.

Los caracteres 34 y 92 son los caracteres "y \respectivamente, y generalmente se esperan y se escapan correctamente. Son los caracteres 0 a 31 los que te darían problemas.

Para ayudar con la depuración, antes de hacerlo 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;
        }
    }
}
Pacerier
fuente
0

¿Por qué necesitas JSON.parse? Ya está en una matriz de formato de objeto.

Mejor use JSON.stringify como se muestra a continuación: var b = JSON.stringify(products);

Esto puede ayudarte.

abhijit padhy
fuente
0

Oh hombre, las soluciones en todas las respuestas anteriores proporcionadas hasta ahora no funcionaron para mí. Tuve un problema similar en este momento. Logré resolverlo envolviendo la cita. Mira la captura de pantalla. Whoo

ingrese la descripción de la imagen aquí

Original:

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

Bien Smith
fuente
0

El error que está obteniendo, es decir, "token inesperado o" es porque se espera json pero se obtiene el objeto durante el análisis. Esa "o" es la primera letra de la palabra "objeto".

Shashank Bodkhe
fuente
0

El único error que está cometiendo es que está analizando un objeto ya analizado, por lo que es un error de lanzamiento, use esto y estará listo.

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[0].name); //name of item at 0th index

si desea imprimir todo json, use JSON.stringify ()

Kiran Maniya
fuente
0

Puede suceder por muchas razones, pero probablemente por un carácter no válido, por lo que puede usarlo JSON.stringify(obj);para convertir su objeto en un JSON, pero recuerde que es una expresión JQUERY.

Elvis Silva Noleto
fuente
0

Tengo este error PORQUE la API que devolvió el objeto json estaba dando UN ERROR (en mi caso Code Igniter, devuelve un html cuando falla el código php) así que NO ES UN OBJETO JSON.

Verifique las oraciones SQL y el código PHP, y pruébelo con Postman (o algún otro probador de API)

Ari Waisberg
fuente
0

El error que estaba cometiendo fue pasar null (sin saberlo) a JSON.parse ().

Entonces arrojó Unexpected token n in JSON at position 0

Aashutosh Rathi
fuente
-24

Uso eval. Toma la expresión / código JavaScript como cadena y lo evalúa / ejecuta.

eval(inputString);
Kasthuri
fuente
Cada invocación de eval () crea una nueva instancia del intérprete de JavaScript. Esto puede ser un gran recurso.
Yëco