反序列化客户端AJAX JSONdate

鉴于以下JSONdate表示forms:

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

你如何反序列化它的JavaScriptdate型表单?

我已经尝试使用MS AJAX JavaScrioptSerializer,如下所示:

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

但是,我所得到的是stringdate。

假如你知道string绝对是我喜欢这样做的date:

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

在ASP.NET Atlas / AJAX上工作的Bertrand LeRoy 描述了JavaScriptSerializer DateTime输出的devise,并揭示了神秘的前后斜杠的起源。 他提出这个build议:

运行一个简单的search“\ /date((\ d +))\ /”和replace为“新date($ 1)”之前评估(但validation后)

我将其实现为:

 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 />"); 

这与其他许多答案非常接近:

  • 像Sjoerd Visscher一样使用锚定的正则expression式 – 不要忘记^和$。
  • 避免string.replace,以及RegEx上的“g”或“i”选项。 “/ Date(1271389496563)// Date(1271389496563)/”should not work at all。

JSON值是一个string,数字,对象,数组,true,false或null。 所以这只是一个string。 在JSON中没有官方的方式来表示date。 这个语法来自asp.net ajax实现。 其他人使用ISO 8601格式。

你可以像这样parsing它:

 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]); 

在ASP.net AJAX反序列化方法中使用的正则expression式寻找一个看起来像“/ Date(1234)/”(string本身实际上需要包含引号和斜杠)的string。 为了得到这样一个string,你将需要转义引号和反斜杠字符,所以创buildstring的javascript代码看起来像“\”\ / Date(1234)\ / \“”。

这将工作。

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

这有点奇怪,但我发现我不得不序列化一个date,然后序列化返回的string,然后在客户端反序列化一次。

像这样的东西。

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

对于那些不想使用Microsoft Ajax的用户,只需在string类中添加一个原型函数即可。

例如

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

不想使用eval? 尝试一些简单的

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

作为一个方面说明,我曾经认为微软使用这种格式是误导性的。 然而,当定义一种在JSON中描述date的方法时,JSON规范并不十分清楚。

大号是标准的JS时间

 new Date(1221644506800) 

Wed Sep 17 2008 19:41:46 GMT + 1000(美东时间)

实际上,momentjs支持这种格式,你可能会这样做:

  var momentValue = moment(value); momentValue.toDate(); 

这将以javascriptdate格式返回值