2008-09-17 27 views
35

鑑於以下JSON日期表示:反序列化客戶端AJAX JSON日期

"\/Date(1221644506800-0700)\/" 

你如何反序列化到這一點它的JavaScript日期型的形式?

我使用MS AJAX JavaScrioptSerializer嘗試如下圖所示:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/") 

然而,所有我回來是字面上的日期。

+0

你使用jQuery也許一個JavaScript日期格式返回值?查看我的博客文章以自動轉換日期,因此您不必手動執行。 http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html – 2010-12-27 15:51:39

+0

請參閱下面的評論。您的博客代碼在時代之前的日期失敗。 – 2011-11-28 18:16:35

回答

28

只要你知道字符串肯定是一個日期,我更喜歡這樣做:

new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10)) 
1

大數目是標準JS時間

new Date(1221644506800) 

星期三2008年9月17日19時41分46秒GMT + 1000(EST)

10

甲JSON值是一個字符串,數字,對象,數組,true,false或null。所以這只是一個字符串。沒有官方的方式來在JSON中表示日期。這個語法來自asp.net ajax實現。其他人使用ISO 8601格式。

你可以這樣分析它:

var s = "\/Date(1221644506800-0700)\/"; 
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/); 
var date = null; 
if (m) 
    date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]); 
+0

這對我不起作用 – CVertex 2009-09-01 12:13:37

+0

My toJson方法正在將序列化日期吐出爲「\/Date(1251795070160)\ /」,您的代碼無法解析。我會研究爲什麼以後,只是在這裏發佈 – CVertex 2009-09-01 12:21:04

+0

+1來明確JSON值可以是什麼,並且這些日期不是其中之一,而是一種自定義格式。 – 2011-09-29 14:20:15

5

在ASP.net AJAX反序列化方法所使用的正則表達式尋找看起來像「/日期(1234)/」(字符串本身實際上是一個字符串需要包含引號和斜槓)。爲了得到這樣一個字符串,你需要轉義引號和反斜槓字符,所以創建字符串的javascript代碼看起來像「\」\/Date(1234)\/\「」。

這將工作。

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"") 

這是一種奇怪的,但我發現我不得不序列化一個日期,然後序列化從返回的字符串,然後在客戶端反序列化一次。

就是這樣。

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer(); 
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now))); 
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true); 
3

對於那些不希望使用微軟的Ajax誰,只需添加一個原型函數的字符串類。

E.g.

String.prototype.dateFromJSON = function() { 
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)")); 
}; 

不想使用eval?嘗試一些簡單的東西,如

var date = new Date(parseInt(jsonDate.substr(6))); 

作爲一個便箋,我曾經認爲微軟使用這種格式會產生誤導。然而,當定義一種用JSON描述日期的方法時,JSON規範並不是非常明確。

16

Bertrand LeRoy,曾在ASP.NET Atlas/AJAX,described the design of the JavaScriptSerializer DateTime output上工作,並揭示了神祕的領先和尾隨正斜槓的起源。他提出這一建議:

運行一個簡單的搜索 「\ /日期((\ d +))\ /」 和EVAL之前, 「新的日期($ 1)」 代替 (但驗證後)

我實現了,作爲:

var serializedDateTime = "\/Date(1271389496563)\/"; 
document.writeln("Serialized: " + serializedDateTime + "<br />"); 

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$"); 
function toDate(s) { 
    if (!s) { 
     return null; 
    } 
    var constructor = s.replace(toDateRe, "new Date($1)"); 
    if (constructor == s) { 
     throw 'Invalid serialized DateTime value: "' + s + '"'; 
    } 
    return eval(constructor); 
} 

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />"); 

這是非常接近的許多其他的答案:

  • 使用錨定的RegEx作爲Sjoerd Visscher做的 - 不要忘記^和$。
  • 避免string.replace和RegEx上的'g'或'i'選項。 「/ Date(1271389496563)// Date(1271389496563)/」should not work at all。
1

其實,momentjs支持這種格式,你可以這樣做:

var momentValue = moment(value); 

    momentValue.toDate();