Búsqueda de sitios web

javascript - SyntaxError: Token inesperado o en JSON en la posición 1


Estoy analizando algunos datos usando una clase de tipo en mi controlador. Estoy obteniendo 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"
}

Intenté 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?

Respuesta #1

El JSON que publicaste se ve bien, sin embargo, en tu código, es muy probable que ya no sea una cadena JSON, sino un objeto de JavaScript. Esto significa que ya no es necesario hacer más parseo.

Puedes probar esto tú 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 método toString() de los objetos de JavaScript por defecto devuelve [object Object], resultando en el comportamiento observado.

Prueba lo siguiente en su lugar:

var newData = userData.data.userList;

Respuesta #2

Se espera que el primer parámetro de la función JSON.parse sea una cadena, y tus datos son un objeto de JavaScript, por lo que lo convertirá a la cadena "[object Object]". Debes usar JSON.stringify antes de pasar los datos:

JSON.parse(JSON.stringify(userData))

Respuesta #3

Nunca uses JSON.parse sin envolverlo en un bloque try-catch:

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = 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

Respuesta #4

Justo encima de JSON.parse, usa:

var newData = JSON.stringify(userData)

Respuesta #5

También podemos agregar verificaciones como esta:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

Artículos relacionados