2015-03-03 19 views
5

benim ikame denilen olsun bir yolu önce orada mı bir nesne ı nesneye veya prototip üzerinde toJSON geçersiz kılma olmadan ziyade kendi JSON dostu forma göre daha özgün nesne, ile çalışmak, böylece toJSON, dönüştürür kendi , nesnenin önceden işlenmesi veya kendi sürümümü JSON.stringify mu yazıyor?Değiştiriciyi * önce * nesneyiJSON'a mı?

Örneğin: Normal serileştirme işleminden (which is toISOString) farklı olarak Date örneklerini serileştirmek istediğimi varsayalım. (Bu soru değil belirli Date için, bu sadece bir örnektir budur.) Problemdir, benim ikame Date nesneyi görmez, bir dize (aşağıda pasajı bakınız) Date.prototype.toJSON çünkü benim ikame önce denir görür .

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(value)); // "string" <== Want to see a Date here 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

ilk adlandırılan replacer almanın bir yolu var mı ? Date.prototype.toJSON'u geçersiz kılmak, nesneyi önceden işlemek veya kendi JSON.stringify'umu yazmak istemiyorum, ancak başka bir yol göremiyorum. MDN kaynaktan

cevap

7

Bunu hile yapmak gerekir düzeltmek anlamak, this hep JSON.stringify anda yineleme olan nesnedir eminim Üzeri:

+0

Güzel. Hatta bir doküman parçasını ('JSON.stringify (new Date())'), bir belgenin tamamını tasnif ettiğiniz [istisnai durum için çalışır] (http://jsbin.com/zeciqiwawo/1), teşekkürler [9-11 adımları] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3). –

+0

gerçekten hoş bir .. –

3

:

anahtar ikame en this parametresi sağlanan bulunmuştur ki burada nesne.

Yani bunu yapabilirsiniz:

var obj = { 
 
    d: new Date() 
 
}; 
 
snippet.log(getType(obj.d));  // "[object Date]" 
 

 
var json = JSON.stringify(obj, function(key, value) { 
 
    if (key === "d") { 
 
    snippet.log(getType(this[key])); 
 
    } 
 
    return value; 
 
}); 
 

 
function getType(value) { 
 
    var to = typeof value; 
 
    if (to === "object") { 
 
    to = Object.prototype.toString.call(value); 
 
    } 
 
    return to; 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Teşekkürler. Daha iyi bir yol olması gerektiğini biliyordum. :-) –

İlgili konular