给出以下JSON日期表示形式:
1
| "\\/Date(1221644506800-0700)\\/" |
如何将其反序列化为JavaScript日期类型形式?
我尝试使用MS AJAX JavaScrioptSerializer,如下所示:
1
| Sys.Serialization.JavaScriptSerializer.deserialize("\\/Date(1221644506800-0700)\\/") |
但是,我得到的只是文字字符串日期。
假设您知道字符串绝对是我更喜欢这样做的日期:
1
| new Date(parseInt(value.replace("/Date(","").replace(")/",""), 10)) |
致力于ASP.NET Atlas / AJAX的Bertrand LeRoy描述了JavaScriptSerializer DateTime输出的设计,并揭示了神秘的前斜杠和后斜杠的起源。他提出了以下建议:
run a simple search for"\\/Date((\\d+))\\/" and replace with"new Date($1)" before the eval
(but after validation)
我将其实现为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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一样使用固定的RegEx-不要忘记^和$。
-
避免在RegEx上使用string.replace和'g'或'i'选项。" / Date(1271389496563)// Date(1271389496563)/"根本不起作用。
JSON值是字符串,数字,对象,数组,true,false或null。所以这只是一个字符串。没有官方的方式来表示JSON中的日期。此语法来自asp.net ajax实现。其他人则使用ISO 8601格式。
您可以这样解析:
1 2 3 4 5
| 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反序列化方法中使用的正则表达式将查找一个类似于" / Date(1234)/"的字符串(该字符串本身实际上需要包含引号和斜杠)。要获得这样的字符串,您需要转义引号和反斜杠字符,因此用于创建字符串的javascript代码看起来像" " \\\\ / Date(1234)\\\\ / "。
这将起作用。
1
| Sys.Serialization.JavaScriptSerializer.deserialize(""\\\\/Date(1221644506800)\\\\/"") |
有点奇怪,但是我发现我必须序列化一个日期,然后序列化从该日期返回的字符串,然后在客户端一次反序列化。
类似这样的东西。
1 2 3
| 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的人,只需将原型函数添加到字符串类中。
例如
1 2 3
| String.prototype.dateFromJSON = function () {
return eval(this.replace(/\\/Date\\((\\d+)\\)\\//gi,"new Date($1)"));
}; |
不想使用eval吗?试试简单的东西,例如
1
| var date = new Date(parseInt(jsonDate.substr(6))); |
作为旁注,我曾经认为Microsoft通过使用这种格式会产生误导。但是,在定义定义JSON中日期的方式时,JSON规范不是很清楚。
实际上,momentjs支持这种格式,您可以执行以下操作:
1 2 3
| var momentValue = moment(value);
momentValue.toDate(); |
这将以javascript日期格式返回值
大数字是标准JS时间
2008年9月17日星期三19:41:46 GMT 1000(EST)