Pregunta

Dada una cadena de datos JSON, ¿cómo se puede convertir esa cadena de forma segura 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.

¿Fue útil?

Solución

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

Otros consejos

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

let jsonObject = JSON.parse(jsonString);

Respuesta original utilizando la funcionalidad jQuery obsoleta:

Si estás usando jQuery solo usa:

jQuery.parseJSON( jsonString );

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

Editar:Esta respuesta es para IE <7; para navegadores modernos, consulte 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.

Utilice el código simple representado a continuación 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);

No estoy seguro de otras formas de hacerlo, pero así es como se hace en Prototipo (tutorial JSON).

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

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

Este parece ser el problema:

Se recibe una entrada, a través de ajax websocket, etc., y siempre estará en formato String, pero necesita saber si es JSON.parsable.El problema es que si siempre lo ejecuta a través de 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'
});

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

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

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

A la devolución de llamada se le pasan los datos devueltos, que serán un objeto o matriz JavaScript definido por la estructura JSON y analizado utilizando el $.parseJSON() método.

Sólo por diversión, esta es la forma de usar la función:

 jsonObject = (new Function('return ' + jsonFormatData))()

Intente utilizar el método con este objeto de datos.ex:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

Este método realmente ayuda en Nodejs cuando trabajas con programación de puerto serie

Usar JSON.parse es probablemente la mejor manera.Aquí hay un ejemplo demo en vivo

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

La forma más fácil de usar parse() método:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

entonces puedes obtener los valores de Json elementos, por ejemplo:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

Usando jQuery como se describe en el documentación:

JSON.parse(jsonString);

Encontré una forma "mejor":

En CoffeeScript:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

En Javascript:

var data;

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

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

json.parse se convertirá en objeto.

El análisis JSON siempre es un dolor de cabeza.Si la entrada no es la esperada, genera un error y bloquea lo que está haciendo.Puede utilizar la siguiente pequeña función para analizar su entrada de forma segura.Siempre convierte un objeto incluso si la entrada no es válida o ya es un objeto, lo cual es mejor en la mayoría de los casos.

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

Convertir el objeto a JSON y luego analizarlo funciona para mí, como:

JSON.parse(JSON.stringify(object))

Si tenemos una cadena como esta:"{" status ": 1, " token ": " 65b4352b2dfc4957a09add0ce5714059 "}" entonces podemos simplemente usar json.parse dos veces para convertir esta cadena en un objeto JSON:

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

Y simplemente podemos extraer valores del objeto JSON usando:

    // instead of last JSON.parse:
    var { status, token } = JSON.parse(jsonString);

El resultado será:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

JSON.parse() convierte cualquier cadena JSON pasada a la función en un objeto JSON.

Para una mejor comprensión, presione F12 para abrir Inspeccionar elemento de su navegador y vaya a la consola para escribir los siguientes comandos:-

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

Ahora ejecute el comando: -

console.log(JSON.parse(response));

obtendrás el resultado como Objeto {resultado:cierto, cuenta:1}.

Para usar ese Objeto, puedes asignarlo a la variable, digamos obj:-

var obj = JSON.parse(response);

Ahora, utilizando el operador obj y punto (.) puede acceder a las propiedades del objeto JSON.

Intenta ejecutar el comando

console.log(obj.result);

Documentado oficialmente:

El JSON.parse() El método analiza una cadena JSON y construye el valor u objeto de JavaScript descrito por la cadena.Un opcional reviver Se puede proporcionar una función para realizar una transformación en el objeto resultante antes de devolverlo.

Sintaxis

JSON.parse(text[, reviver])

Parámetros

texto

La cadena que se va a analizar como JSON.Consulte el objeto JSON para obtener una descripción de la sintaxis JSON.

reanimador (opcional)

Si es una función, esto prescribe cómo se transforma el valor producido originalmente mediante el análisis, antes de ser devuelto.

Valor de retorno

El Objeto correspondiente al texto JSON dado.

Excepciones

Lanza una excepción SyntaxError si la cadena a analizar no es JSON válida.

También puedes usar reviver función para filtrar.

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

para más información lea JSON.parse

Pregunta anterior, lo sé, sin embargo, nadie nota esta solución al usar new Function(), una función anónima que devuelve los datos.


Sólo un ejemplo:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

Esto es un poco más seguro porque se ejecuta dentro de una función y no se compila directamente en su código.Entonces, si hay una declaración de función dentro de él, no estará vinculada al objeto de ventana predeterminado.

Utilizo esto para 'compilar' ajustes de configuración de elementos DOM (por ejemplo, el atributo de datos) de forma sencilla y rápida.

Analice la cadena json con JSON.parse() y los datos se convierten en un objeto JavaScript.

JSON.parse(jsonString)

Aquí, JSON representa procesar el conjunto de datos json.

Ejemplo, imagine que recibimos este texto de un servidor web:

'{ "name":"John", "age":30, "city":"New York"}'

Para analizar en un objeto json:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

Aquí obj es el objeto JSON respectivo que se parece a lo siguiente.

{ "name":"John", "age":30, "city":"New York"}

Para recuperar el valor utilizado.operador Ejemplo:

obj.name // John
obj.age //30

Para transferir lo contrario, convierta un objeto JavaScript en una cadena con JSON.stringify().

Resumen:

Javascript (tanto el navegador como NodeJS) tiene una función incorporada JSON objeto.En este Objeto hay 2 métodos convenientes para tratar con JSON.Son los siguientes:

  1. JSON.parse() Acepta JSON como argumento, devuelve un objeto JS
  2. JSON.stringify() Toma el objeto JS como argumento devuelto JSON objeto

Otras aplicaciones:

Además de tratar muy cómodamente JSON que tienen se pueden utilizar para otros medios.La combinación de ambos JSON Los métodos nos permiten hacer muy fácilmente clones profundos de matrices u objetos.Por ejemplo:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged

Si su JavaScript está en Mootools el JSON.parse será anónimo por el marco.
Un válido sintaxis Para convertir de forma segura una cadena JSON en un objeto será:

var object = JSON.decode(string[, secure]);

Además un JSON Request Esto puede generar un objeto que pueda analizarse directamente.
Puedes ver cómo se convierte en datos sin procesar json aquí:

http://jsfiddle.net/chetabahana/qbx9b5pm/

Prueba esto. Éste está escrito a máquina.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top