Gibi bir nesneyi diziyorum {'foo': 'bar'}
Dizeyi bir nesneye nasıl geri döndürebilirim?
Gibi bir nesneyi diziyorum {'foo': 'bar'}
Dizeyi bir nesneye nasıl geri döndürebilirim?
Yanıtlar:
Dizeye ihtiyacınız var JSON.parse()
.
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
tam tersidir JSON.stringify
.
JSON.stringify
ve JSON.parse
neredeyse opositlerdir ve "genellikle" bu tür şeyler işe yarar:
var obj = ...;
var json = JSON.stringify(obj);
var obj2 = JSON.parse(json);
böylece obj ve obj2 "aynı" olur.
Ancak, bilinmesi gereken bazı sınırlamalar vardır. Basit nesnelerle uğraşırken genellikle bu konular önemli değildir. Ama bu yardımcı işlevi kullanarak bazılarını burada açıklayacağım:
function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
Sadece ownProperties
nesneyi alır ve prototipleri kaybedersiniz:
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
Kimliğinizi kaybedeceksiniz:
var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // false
Fonksiyonlar hayatta kalmaz:
jsonrepack( { f:function(){} } ); // Returns {}
Tarih nesneleri dize olarak sonlanır:
jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
Tanımsız değerler hayatta kalamaz:
var v = { x:undefined }
console.log("x" in v); // true
console.log("x" in jsonrepack(v)); // false
toJSON
İşlev sağlayan nesneler doğru davranmayabilir.
x = { f:"foo", toJSON:function(){ return "EGAD"; } }
jsonrepack(x) // Returns 'EGAD'
Eminim diğer yerleşik tiplerle de sorunlar var. (Tüm bunlar ortamınıza bağlı olarak biraz farklı davranışlar elde edebilmeniz için node.js kullanılarak test edilmiştir).
Önemli olduğunda JSON.parse
ve ve ek parametrelerini kullanarak bazen aşılabilir JSON.stringify
. Örneğin:
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" }
prototipinizden) geçerli bir json olarak değerlendirilmemesidir, çünkü foo
bir dize yerine bir değişkentir. Geçerli json, key
a string
.
JSON.parse
. Sadece doğru şekilde işlemeyecek birçok durum olduğunu uyarıyorum. Saf ilkel veriler (sınıflar, prototipler yok) ve yalnızca JSON tarafından desteklenen veri türleri (tarihler, XML, HTML vb.) Kullanıyorsanız, sorun olmaz demektir.
X = { foo:"bar" }
ile aynı X = { "foo":"bar" }
olanla X = {}; X.foo = "bar"
aynıdır X={}; X["foo"] = "bar"
Sonuçta ortaya çıkan nesne 4 durumda da aynıdır. Bu, oluşturulan JSON'un geçerliliği üzerinde hiçbir fark yaratmaz.
http://jsbin.com/tidob/1/edit?js,console,output
Yerel JSON nesnesi iki anahtar yöntem içerir.
1. JSON.parse()
2. JSON.stringify()
JSON.parse()
Yöntem, bir JSON dizesi ayrıştırır - yani orijinal JavaScript nesneyi oluşturduktan
var jsObject = JSON.parse(jsonString);
JSON.stringify () yöntemi bir JavaScript nesnesini kabul eder ve JSON eşdeğerini döndürür.
var jsonString = JSON.stringify(jsObject);
Önerilen JSON.parse
Yapabileceğiniz bir alternatif var:
var myObject = eval('(' + myJSONtext + ')');
Buna ne dersin
var parsed = new Function('return ' + stringifiedJSON )();
Bu daha güvenli bir alternatiftir eval
.
Şuna bir bak.
http://jsfiddle.net/LD55x/
Kod:
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'}
Geçerli bir JSON olmadığını unutmayın (geçerli bir javascript ifadesi olsa da).