Pregunta Con seguridad convirtiendo una cadena JSON en un objeto


Dada una cadena de datos JSON, ¿cómo puede convertir con seguridad esa cadena en un objeto JavaScript?

Obviamente, puedes hacer esto de forma insegura con algo como ...

var obj = eval("(" + json + ')');

... pero eso nos deja vulnerables a la cadena json que contiene otro código, que parece muy peligroso simplemente evaluar.


1126
2017-09-05 00:12


origen


Respuestas:


JSON.parse(jsonString) es un enfoque de JavaScript puro siempre que pueda garantizar un navegador razonablemente moderno.


1699
2018-04-16 11:45



El método jQuery ahora está en desuso. Use este método en su lugar:

let jsonObject = JSON.parse(jsonString);

Respuesta original utilizando la funcionalidad jQuery obsoleta:

Si está utilizando jQuery simplemente use:

jQuery.parseJSON( jsonString );

Es exactamente lo que estás buscando (ver jQuery documentación)


855
2017-09-02 14:07



Editar: Esta respuesta es para IE <7, para los navegadores modernos verifique la respuesta de Jonathan anterior.

Editar: esta respuesta está desactualizada y La respuesta de Jonathan arriba (JSON.parse(jsonString)) es ahora el la mejor respuesta.

JSON.org tiene analizadores JSON para muchos idiomas, incluidos 4 diferentes para Javascript. Creo que la mayoría de la gente consideraría json2.js su implementación goto.


138
2017-09-05 00:13



Use un código simple representado en el siguiente enlace en MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

y revertir

var str = JSON.stringify(arr);

61
2017-12-15 23:26



No estoy seguro de otras formas de hacerlo, pero así es cómo lo haces en Prototipo (tutorial de JSON).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Vocación evalJSON () con verdadero, ya que el argumento desinfecta la cadena entrante.


17
2017-09-05 00:13



Este parece ser el problema:

Se recibe una entrada, a través de ajax websocket, etc., y siempre estará en formato de cadena, pero necesita saber si es JSON.parsable. Touble es que si siempre lo ejecuta a través de un JSON.parse, el programa PUEDE continuar "con éxito" pero aún verá un error en la consola con el temido "Error: Token inesperado" x ".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

15
2018-04-29 07:37



Si estás usando jQuery, también puedes simplemente hacer $.getJSON(url, function(data) { });

Entonces puedes hacer cosas como data.key1.something, data.key1.something_else, etc.


11
2017-10-24 13:57



$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

La devolución de llamada se pasa a los datos devueltos, que serán un objeto o matriz de JavaScript según lo definido por la estructura JSON y analizados utilizando el $.parseJSON() método.


10
2018-05-06 06:23