Búsqueda de sitios web

javascript - ¿Reversa de JSON.stringify?


Estoy convirtiendo a cadena un objeto como {'foo': 'bar'}

¿Cómo puedo convertir la cadena de nuevo en un objeto?

Respuesta #1

Necesitas JSON.parse() tu cadena JSON válida.

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}

Respuesta #2

JSON.parse es lo opuesto de JSON.stringify.

Respuesta #3

JSON.stringify y JSON.parse son casi opuestos, y "usualmente" este tipo de cosa funcionará:

var obj = ...;
var json = JSON.stringify(obj);  
var obj2 = JSON.parse(json);

para que obj y obj2 sean "lo mismo".

Sin embargo, hay algunas limitaciones que debemos tener en cuenta. A menudo estos problemas no importan cuando estás trabajando con objetos simples. Pero voy a ilustrar algunos de ellos aquí, usando esta función auxiliar:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Solo obtendrás las propiedadesPropias del objeto y perderás los prototipos:

    var MyClass = function() { this.foo="foo"; } 
    MyClass.prototype = { bar:"bar" }
    
    var o = new MyClass();
    var oo = jsonrepack(o);
    console.log(oo.bar); // undefined
    console.log( oo instanceof MyClass ); // false
    
  • Perderás la identidad:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
    
  • Las funciones no sobreviven:

    jsonrepack( { f:function(){} } ); // Returns {}
    
  • Los objetos Date terminan como cadenas:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
    
  • Los valores indefinidos no sobreviven:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
    
  • Los objetos que proporcionan una función toJSON pueden no comportarse correctamente.

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'
    

Estoy seguro de que también hay problemas con otros tipos integrados. (Todo esto se probó usando node.js, así que es posible que obtengas un comportamiento ligeramente diferente según tu entorno).

Cuando sí importa, a veces se puede superar utilizando los parámetros adicionales de JSON.parse y JSON.stringify. Por ejemplo:

function MyClass (v) {
   this.date = new Date(v.year,1,1);
   this.name = "an object";
};

MyClass.prototype.dance = function() {console.log("I'm dancing"); }

var o = new MyClass({year:2010});
var s = JSON.stringify(o);

// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
  if(k==="") { 
     var rv = new MyClass(1990,0,0);
     rv.date = v.date;
     rv.name = v.name;
     return rv
  } else if(k==="date") {
    return new Date( Date.parse(v) );
  } else { return v; } } );

console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance();                  // I'm dancing

console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]        
o2.dance();                 // I'm dancing

Artículos relacionados