2012-02-08 117 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' } 

我有一個類似上面的「日期時間」字段的JSON對象。這是完美的。但是,當我字符串化(我想其存儲在緩存中),我得到這樣的格式:爲什麼JSON.stringify搞砸了我的日期時間對象?

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

這會導致問題,因爲當我想JSON.parse這個,突然它不再日期時間格式,它是不兼容與我的其他格式。

我能做些什麼來解決這個問題?我的應用程序中到處都有'created_at'亂七八糟的東西。我不想手動更改每一個。

+0

想必您將這些日期序列化以將其存儲在localStorage中。在這種情況下,你可以通過使用像rhaboo這樣的包裝庫來避免像這樣或類似的仇恨。 – 2015-04-21 05:11:22

回答

13

有沒有特殊的方式來序列化JSON中的對象Date。這就是爲什麼你得到標準化的字符串表示。您需要將它們傳遞迴Date構造函數,將它們轉換回Date對象。

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

更新:隨着reviver功能(見註釋),你可以得到Date對象回來。

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

那麼我無能爲力? – TIMEX 2012-02-08 13:47:28

+0

不,我不這麼認爲。你將不得不以其他方式存儲它。 – 2012-02-08 13:49:21

+0

Date對象是JavaScript本地的,但JSON是用於在平臺之間傳輸數據的序列化機制。如果它允許本地對象和函數的序列化,則從JS向PHP傳輸JSON的系統將會中斷。你可能想看看JSON'reviver'方法。 – JAAulde 2012-02-08 13:51:38

10

實際上可以修改Date對象如何被序列化爲JSON。結合reviver函數,可以創建一個雙向解決方案,它將自動處理序列化,並且可以輕鬆用於反序列化。

首先修改這樣的序列:

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

這將前綴改變Date對象的表示爲Unix時間戳作爲標記:

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

然後你就可以創建一個reviver功能,將自動過濾掉這些值:

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 :此代碼已基本從這個答案抄在一個相關的問題:https://stackoverflow.com/a/14509447/2572897

這種設置

現在,從之前我們的結果的反序列化將導致Date對象再次:

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

或者你可以選擇不修改串行化而是使用正則表達式來捕捉標準序列化格式:

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; 
} 

實施例:

> 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'); }

您可以閱讀更多關於時刻文件和定製你想要返回的日期類型。