2012-02-08 19 views
8
{ id: 1533, 
    story_type_id: 1, 
    content_id: 470, 
    created_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    updated_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    type_name: 'post' } 

Yukarıdaki gibi "datetime" alanı olan bir JSON nesnesine sahibim. Mükemmel. Bunu JSON.parse istediğinizde, aniden artık datetime biçimi, çünkü bu sorunlara neden olurJSON.stringify neden datetime nesneyi sıkıştırıyor?

"created_at":"2012-02-05T07:02:43.000Z" 

ve uyumsuz: Ben (Ben önbellekte saklamak istiyorum) stringify Fakat ben bu biçimi olsun diğer formatımla.

Bu sorunu çözmek için ne yapabilirim? Uygulamamın her yerinde 'created_at' var. Her birini manuel olarak değiştirmek istemiyorum.

+0

Muhtemelen bu tarihleri ​​localStorage'da depolamak için serileştiriyorsunuz. Bu durumda, bunun gibi bir agoniden ve benzer bir şekilde rhaboo gibi bir sarmalayıcı kitaplığı kullanarak önleyebilirsiniz. –

cevap

13

JSON'da Date nesnelerini seri hale getirmenin özel bir yolu yoktur. Bu yüzden standartlaştırılmış dize gösterimini aldınız. Bunları, Date yapıcısına ileterek bunları Date nesnelerine dönüştürmeniz gerekir.

item['created_at'] = new Date(item['created_at']); 

Güncelleme: reviver fonksiyonu (yorumlara bakınız) ile, Date nesneleri geri alabilirsiniz.

var item = JSON.parse(row, function (key, value) { 
    if (key === 'created_at') { 
    return new Date(value); 
    } else { 
    return value; 
    } 
}); 
+0

Bu konuda yapabileceğim hiçbir şey yok mu? – TIMEX

+0

Hayır, sanmıyorum. Başka bir şekilde saklamak zorunda kalacaksın. –

+0

'Date' nesnesi, JavaScript’e özgüdür, ancak JSON, platformlar arasında veri taşımak için kullanılan bir serileştirme mekanizmasıdır. Yerel nesnelerin ve işlevlerin serileştirilmesine izin verilmişse, JSON'u JS'den ileten sistemlere, PHP'nin kırılacağını söyleyebiliriz. JSON 'reviver' metodolojilerine bakmak isteyebilirsiniz. – JAAulde

10

Bir Date nesnesinin JSON'a nasıl serileştirileceğini değiştirmek aslında mümkündür. Reviver fonksiyonu ile birleştirildiğinde, seri hale getirme üzerinde otomatik olarak çalışacak ve serileştirme işleminde kolaylıkla kullanılabilen iki yönlü bir çözüm oluşturulabilir.

Öncelikle bu gibi seri değiştirin:

> json = JSON.stringify({test:new Date()}); 
"{"test":"{timestamp}1380164268633"}" 

Sonra bir oluşturabilirsiniz: Bu bir işaretleyici olarak bir önek ile UNIX zaman damgası içine Date nesnesinin temsil değişecek

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() } 

Bu değerleri otomatik olarak filtreleyen yeniden canlandırma fonksiyonu:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^{timestamp}(\d*)$/.exec(value); 
    if (regexp) { 
     return new Date(+regexp[1]); 
    } 
    } 
    return value; 
} 

(Credit : Bu kod temelde İlgili bir soru bu cevap kopyalanmıştır:

> JSON.parse(json, json_deserialize_helper); 
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)} 

Yoksa seçebilirsiniz: https://stackoverflow.com/a/14509447/2572897) Bu kurulum ile Şimdi

, önce bizim sonucun seri kaldırma tekrar date nesnesinin neden olacaktır seri değiştirmek yerine standart seri hale getirme biçimi yakalamak için regexp'i kullanmamak:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value); 
    if (regexp) { 
     return new Date(value); 
    } 
    } 
    return value; 
} 

Örnek:

> json = JSON.stringify({test:new Date()}) 
"{"test":"2013-09-26T03:05:26.563Z"}" 
> JSON.parse(json, json_deserialize_helper) 
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)} 
0

Date.prototype.toJSON = function() {return moment (this) .format ('L'); }

Anlık belgelerle ilgili daha fazla bilgiyi ve geri dönmek istediğiniz tarihi istediğiniz gibi okuyabilirsiniz.