Estou pressionando um objeto como {'foo': 'bar'}
Como posso transformar a string de volta em um objeto?
Estou pressionando um objeto como {'foo': 'bar'}
Como posso transformar a string de volta em um objeto?
Respostas:
Você precisa JSON.parse()da string.
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é o oposto de JSON.stringify.
JSON.stringifye JSON.parsesão quase opostos, e "geralmente" esse tipo de coisa funcionará:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
para que obj e obj2 sejam "iguais".
No entanto, existem algumas limitações a serem observadas. Geralmente, esses problemas não importam, pois você lida com objetos simples. Mas ilustrarei alguns deles aqui, usando esta função auxiliar:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Você só conseguirá ownPropertieso objeto e perderá protótipos:
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 ); // falseVocê perderá a identidade:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // falseAs funções não sobrevivem:
jsonrepack( { f:function(){} } ); // Returns {}Os objetos de data terminam como seqüências de caracteres:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'Valores indefinidos não sobrevivem:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // falseObjetos que fornecem uma toJSONfunção podem não se comportar corretamente.
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'Tenho certeza de que também há problemas com outros tipos internos. (Tudo isso foi testado usando o node.js, para que você possa ter um comportamento um pouco diferente dependendo do seu ambiente também).
Quando isso importa, às vezes pode ser superado usando os parâmetros adicionais de JSON.parsee JSON.stringify. Por exemplo:
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" }(do seu protótipo) não é considerado json válido, pois fooé uma variável e não uma string. O json válido precisa keyser a string.
JSON.parse. Só estou avisando que existem muitos casos que não serão tratados corretamente. Se você estiver usando dados primitivos puros (sem classes, protótipos) e apenas os tipos de dados suportados pelo JSON (sem datas, XML, HTML etc.), estará bem.
X = { foo:"bar" }é o mesmo X = { "foo":"bar" }que é o mesmo X = {}; X.foo = "bar"que X={}; X["foo"] = "bar"O objeto resultante é idêntico em todos os 4 casos. Isso não faz diferença para a validade do JSON gerado.
http://jsbin.com/tidob/1/edit?js,console,output
O objeto JSON nativo inclui dois métodos principais.
1. JSON.parse()
2. JSON.stringify()
O JSON.parse()método analisa uma string JSON - isto é, reconstruindo o objeto JavaScript original
var jsObject = JSON.parse(jsonString);
O método JSON.stringify () aceita um objeto JavaScript e retorna seu equivalente em JSON.
var jsonString = JSON.stringify(jsObject);
Recomendado é usar JSON.parse
Existe uma alternativa que você pode fazer:
var myObject = eval('(' + myJSONtext + ')');
Que tal agora
var parsed = new Function('return ' + stringifiedJSON )();
Esta é uma alternativa mais segura para eval.
Veja isso.
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'}JSON não é válido (embora seja uma expressão javascript válida).