在使用jquery和wcf通訊的時候,遇到了通過json傳遞Date對象的問題.通過觀察發現wcf返回到瀏覽器中的json字串 是 "\/Date(1231231323+0800)\/" 形式。前面的數字1231231323是GMT 時區中自1970 年1 月1 日午夜以來按正常時間(非夏令時)經過的毫秒數.
所以可以取出該數字得到Date對象
var dateStr = "\/Date(1231231323+0800)\/";
var date =new Date(parseInt( dataStr.substring(6,dataStr.length-2) ));
當然要想把用戶端的Date對象通過json字串傳遞給wcf也必須把Date對象格式化成 "\/Date(1231231323+0800)\/"形式的字串
var date =new Date();
var dateStr = "\/Date("+date.getTime()+"+0800)\/"
我使用的json2.js中的JSON.stringify和JSON.parse來完成js對象和json字串之間轉換的。但是這兩個方法預設的轉換是按照ISO strings形式轉換的
查看json2.js可以發現下面程式碼片段
Date.prototype.toJSON = function (key) {
return this.getUTCFullYear() + '-' +
f(this.getUTCMonth() + 1) + '-' +
f(this.getUTCDate()) + 'T' +
f(this.getUTCHours()) + ':' +
f(this.getUTCMinutes()) + ':' +
f(this.getUTCSeconds()) + 'Z';
};
所以大家如果只需要個wcf通訊的話可以把這個方法修改下返回wcf形式的字串,這樣直接調用JSON.stringify(data)
就ok了,不用再特別處理時間對象了。
Date.prototype.toJSON = function(key) {
return "\/Date(" + this.getTime() + "+0800)\/";
};
現在看下如何讓JSON.parse方法也自動處理好伺服器端返回的json時間字串,我們知道JSON.parse方法第二個參數是一個回呼函數,可以用來遍曆處理wcf返回json對象的屬性。所以我們可以這樣來解析wcf返回的json字串
JSON.parse(data,function(key, value) {
if (typeof value == "string" && value.indexOf("\/Date(") == 0) {
var s = value.substring(6, value.length - 2);
return new Date(parseInt(s));
}
return value;
})
這裡判斷value是時間的字串不是很嚴格,大家可以自己修改下。
但是這樣每次調用都傳入該函數也挺煩人的,反正我只和wcf通訊,於是也可以修改json2.js
找到下面的程式碼片段
JSON.parse = function (text, reviver) {
// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
var j;
}
然後再parse方法的前面加上下面代碼
JSON.parse = function(text, reviver) {
// 修改×××××××××××××××××××××××××××
if (reviver == undefined) {
reviver = function(key, value) {
if (typeof value == "string" && value.indexOf("\/Date(") == 0) {
var s = value.substring(6, value.length - 2);
return new Date(parseInt(s));
}
return value;
}
} // 修改×××××××××××××××××××××××××××
// The parse method takes a text and an optional reviver function, and returns
// a JavaScript value if the text is a valid JSON text.
var j;
}
這樣當我們就不需要每次傳入
第二個參數reviver 回呼函數了。
我修改過的json2.js檔案 http://files.cnblogs.com/xhan/json2Xhan.js