開發中有時候需要從伺服器端返回json格式的數據,在後台代碼中如果有DateTime類型的數據使用系統自帶的工具類序列化後將得到一個很長的數字表示日期數據,如下所顯示:
context.Response.Write(studentsJson);
運行結果是:
其中Tom所對應生日「2014-01-31」變成了1391141532000,這其實是1970 年1 月1 日至今的毫秒數;1391141532000/1000/60/60/24/315,44. 1970=2014年,依此方法可以得出年月日時分秒和毫秒。這種格式是一種可行的表示形式但不是一般人可以看懂的友善格式,怎麼讓這個格式改變?
方法1:在伺服器端將日期格式使用Select方法或LINQ表達式轉換後發送到客戶端:
複製程式碼
程式碼如下:使用 System.Web.Script.Serialization;
命名空間 JsonDate1
{
使用 System.Linq;
///
/// 學生類,測驗使用
///
🎜> /// 姓名
///
public String Name { getget;
///
/// 生日
// }
///
/// 回學生集合的json字元
///
void ProcessRequest( HttpContext context)
{
public bool IsReusable
{
return false;
}
Select方法重新投影物件集合將Birthday屬性轉換成一個新的屬性,注意屬性變更後要重新命名,屬性名稱可以相同;這裡可以使用select方法也可以使用LINQ查詢表達式,也可以選擇別的方式達到相同的目的;這種方法可以將集合中客戶端不用的屬性剔除,達到簡單優化效能的目的。
運行結果:
這時候的日期格式就已經變成友善格式了,不過在javascript中這只是一個字串。
方法二:
在javascript中將"Birthday":"/Date(1391141532000)/"中的字串轉換成javascript中的日期對象,可以將Birthday這個Key所對應的Value中的非數字字元以替換的方式刪除,到到一個數字1391141532000,然後實例化一個Date對象,將1391141532000毫秒作為參數,得到一個javascript中的日期對象,代碼如下:
上的使用正規/D/igm達到替換所有非數字的目的,D表示非數字,igm是參數,分別表示忽視(ignore)大小寫;多次、全域(global)替換;多行替換( multi-line);有些時候還會出現86的情況,只需要變換正規同樣可以達到目的。另外如果專案中反覆出現這種需要處理日期格式的問題,可以擴充一個javascript方法,程式碼如下:
var birthdayMilliseconds = parseInt(obj.Birthday.replace(/ D/igm, ""));
//實例化一個新的日期格式,使用1970 年1 月1 日至今的毫秒irthday = new Date(birthdayMilliseconds);
$("
//在String物件中擴充一個toDate方法,可依需求完善
String.prototype.toDate = function () { String.prototype.toDate = function () { String.prototype.toDate = function () { if (isNaN(this)) {
//使用正規表示式將日期屬性中的非數位(D)移除
} else {
dateMilliseconds=this;
//實例化一個新的日期格式,並使用1970 年1 月1 日至今的毫秒數為參數 };
上面擴充的方法toDate不一定合理,也不夠強大,可以根據需要修改。
方法三:
可以選擇一些第三方的json工具類,其中不乏有一些已經對日期格式問題已處理好了的,常見的json序列化與反序列化工具庫有:
1.fastJSON.
2.JSON_checker.
5.LitJSON.
6.JSON for .NET .7.JsonFx.
8.JSONSharp.9.JsonExSerializer.
10.fluent-json11.Manatee Json
這裡以litjson為序列化與反序列化json的工具類別範例,程式碼如下:
複製程式碼
using LitJson;
namespace JsonDate2
{
using System.Linq;
///
/// 學生類,測試使用
///
🎜> /// 姓名
///
public String; get get; set;
///
/// 生日
// }
///
/// 回學生集合的json字元
///
void ProcessRequest( HttpContext context)
{
運行結果如下:
這時候的日期格式基本上就正確了,只要在javascript中直接實例化日期就好了,
var date = new Date("01/31/2014 12:12:12");
alert(date.toLocaleString());
客戶端的程式碼如下:
複製程式碼
程式碼如下: toLocaleString()).appendTo("#ulStudents"); alert(date.toLocaleString());這裡講到了三種解決json中序列化後的日期格式問題,應該還有更好更完善的方法,歡迎您告訴我。因為有很多學生問我所以我寫了這點文字,歡迎批評指正。
$(function () {
$.getJSON("GetJson2.ashx", function (students) { (index, obj) {
$ ("
var birthday = new Date(obj.Birthday);
});
});
});