Sto stringendo un oggetto come {'foo': 'bar'}
Come posso riportare la stringa in un oggetto?
Sto stringendo un oggetto come {'foo': 'bar'}
Come posso riportare la stringa in un oggetto?
Risposte:
Hai bisogno JSON.parse()della stringa.
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è l'opposto di JSON.stringify.
JSON.stringifye JSON.parsesono quasi opachi e "di solito" questo genere di cose funzionerà:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
in modo che obj e obj2 siano "uguali".
Tuttavia ci sono alcune limitazioni da tenere presente. Spesso questi problemi non contano poiché hai a che fare con oggetti semplici. Ma ne illustrerò alcuni qui, usando questa funzione di supporto:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Otterrai solo ownPropertiesl'oggetto e perderai i prototipi:
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 ); // falsePerderai identità:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // falseLe funzioni non sopravvivono:
jsonrepack( { f:function(){} } ); // Returns {}Gli oggetti data finiscono come stringhe:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'I valori indefiniti non sopravvivono:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // falseGli oggetti che forniscono una toJSONfunzione potrebbero non comportarsi correttamente.
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'Sono sicuro che ci sono problemi anche con altri tipi predefiniti. (Tutto questo è stato testato usando node.js, quindi potresti avere un comportamento leggermente diverso a seconda del tuo ambiente).
Quando è importante, a volte può essere superato usando i parametri aggiuntivi di JSON.parsee JSON.stringify. Per esempio:
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" }(dal tuo prototipo) non è considerato json valido poiché fooè una variabile piuttosto che una stringa. Json valido ha bisogno keydi essere un string.
JSON.parse. Sto solo avvertendo che ci sono molti casi che non gestiranno correttamente. Se stai utilizzando dati primitivi puri (senza classi, prototipi) e solo i tipi di dati supportati da JSON (senza date, XML, HTML ecc.), Allora stai bene.
X = { foo:"bar" }è lo stesso X = { "foo":"bar" }che è lo stesso X = {}; X.foo = "bar"che è lo stesso come X={}; X["foo"] = "bar"l'oggetto risultante è identico in tutti 4 casi. Ciò non fa alcuna differenza per la validità del JSON generato.
http://jsbin.com/tidob/1/edit?js,console,output
L'oggetto JSON nativo include due metodi chiave.
1. JSON.parse()
2. JSON.stringify()
Il JSON.parse()metodo analizza una stringa JSON, ovvero la ricostruzione dell'oggetto JavaScript originale
var jsObject = JSON.parse(jsonString);
Il metodo JSON.stringify () accetta un oggetto JavaScript e restituisce il suo equivalente JSON.
var jsonString = JSON.stringify(jsObject);
Si consiglia di utilizzare JSON.parse
C'è un'alternativa che puoi fare:
var myObject = eval('(' + myJSONtext + ')');
Perché usare la funzione JavaScript eval è una cattiva idea?
Cosa ne pensi di questo
var parsed = new Function('return ' + stringifiedJSON )();
Questa è un'alternativa più sicura per eval.
Controllalo.
http://jsfiddle.net/LD55x/
Codice:
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'}non è JSON valido (mentre è un'espressione javascript valida).