將Datetime對象序列化成Json對象是常有的事情,微軟的序列化方法會將Datetime對象序列化成一個字符串:
"\/Date(1234656000000)\/"
這樣的字符串相當之不友好,但微軟貌似喜歡,並且Json.net在4.5之前也是這么做的。現在的Json.net在序列化的時候,會將其轉換為ISO標准時間:
"2009-02-15T00:00:00Z"
在使用Json.net的時候,我們還可以使用其默認的DateTime轉換器來處理,這樣轉換的字符串為:
JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());
輸出結果如下:
new Date(1234656000000)
對於這三種格式,其優劣不好做出評判,但處理這個兼容問題還是挺頭疼的。單從字符串上面看,第三種是最好的,直接可以轉換為一個js的Date對象,但筆者嘗試這么用的時候發現,jquery在處理這個返回字符串的時候,會發生錯誤,invalid json,貌似不合法,其中包含了可執行的對象,不是嚴格的字符串了。
第二種格式更是惡心,因為在使用IE將其轉換的時候,居然發現不支持。果斷的拋棄之。
第一種格式是迫不得已,也是兼容性最好的,如果不適用Json.net,微軟的DataContractJsonSerializer或者JavaScriptSerializer都是生成這樣的字符串。那么,在HTML中得到這種返回字符串的時候,我們必須進行一次轉換,將其轉換為Date對象,不知道你們有什么好方法,我一直用的下面的代碼:
Date.FromMSJsonString = function (value) { var d = eval('new ' + (value.replace(/\//g, ''))); return d; }
在轉換完成以后,就可以Date對象進行處理了,最后附上如何讓Json.net 生成微軟的字符串格式:
JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }; string microsoftJson = JsonConvert.SerializeObject(entry, microsoftDateFormatSettings);