Estoy encadenando un objeto como {'foo': 'bar'}
¿Cómo puedo volver la cadena a un objeto?
Estoy encadenando un objeto como {'foo': 'bar'}
¿Cómo puedo volver la cadena a un objeto?
Respuestas:
Necesitas JSON.parse()
la cuerda.
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);
}
JSON.parse
es lo contrario de JSON.stringify
.
JSON.stringify
y JSON.parse
son casi opuestos, y "generalmente" este tipo de cosas funcionarán:
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 a tener en cuenta. A menudo, estos problemas no importan, ya que se trata de objetos simples. Pero ilustraré algunos de ellos aquí, usando esta función auxiliar:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Solo obtendrás ownProperties
el objeto y perderás 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 identidad:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // false
Las funciones no sobreviven:
jsonrepack( { f:function(){} } ); // Returns {}
Los objetos de fecha 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 toJSON
función 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, por lo que también puede obtener un comportamiento ligeramente diferente dependiendo de su entorno).
Cuando importa, a veces puede superarse 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
JSON SPEC
{ bar:"bar" }
(desde su prototipo) no se considera json válido ya que foo
es una variable en lugar de una cadena. Json válido necesita key
que sea a string
.
JSON.parse
. Solo estoy advirtiendo que hay muchos casos que no se manejarán correctamente. Si está utilizando datos primitivos puros (sin clases, prototipos) y solo los tipos de datos admitidos por JSON (sin fechas, XML, HTML, etc.), entonces está bien.
X = { foo:"bar" }
es lo mismo X = { "foo":"bar" }
que lo X = {}; X.foo = "bar"
que es lo mismo que X={}; X["foo"] = "bar"
El objeto resultante es idéntico en los 4 casos. Eso no hace ninguna diferencia en la validez del JSON generado.
http://jsbin.com/tidob/1/edit?js,console,output
El objeto JSON nativo incluye dos métodos clave.
1. JSON.parse()
2. JSON.stringify()
El JSON.parse()
método analiza una cadena JSON, es decir, reconstruye el objeto JavaScript original
var jsObject = JSON.parse(jsonString);
El método JSON.stringify () acepta un objeto JavaScript y devuelve su equivalente JSON.
var jsonString = JSON.stringify(jsObject);
Se recomienda usar JSON.parse
Hay una alternativa que puedes hacer:
var myObject = eval('(' + myJSONtext + ')');
¿Por qué usar la función de evaluación de JavaScript es una mala idea?
Qué tal esto
var parsed = new Function('return ' + stringifiedJSON )();
Esta es una alternativa más segura para eval
.
Mira esto.
http://jsfiddle.net/LD55x/
Código:
var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
$("#save").click(function () {
debugger
var xx = [];
var dd = { "firstname": "", "lastname": "", "address": "" };
var otable1 = $("#table1").dataTable().fnGetData();
for (var i = 0; i < otable1.length; i++) {
dd.firstname = otable1[i][0];
dd.lastname = otable1[i][1];
dd.address = otable1[i][2];
xx.push(dd);
var dd = { "firstname": "", "lastname": "", "address": "" };
}
JSON.stringify(alert(xx));
$.ajax({
url: '../Home/save',
type: 'POST',
data: JSON.stringify({ u: xx }),
contentType: 'application/json;',
dataType: 'json',
success: function (event) {
alert(event);
$("#table2").dataTable().fnDraw();
location.reload();
}
});
});
{foo: 'bar'}
no es válido JSON (si bien es una expresión de javascript válida).