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
propiedadesPropiasdel 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 ); // falsePerderás la identidad:
var o = {}; var oo = jsonrepack(o); console.log( o === oo ); // falseLas 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)); // falseLos objetos que proporcionan una función
toJSONpueden 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
