反序列化客户端 AJAX JSON 日期
题
给定以下 JSON 日期表示形式:
"\/Date(1221644506800-0700)\/"
如何将其反序列化为 JavaScript 日期类型形式?
我尝试使用 MS AJAX JavaScrioptSerializer,如下所示:
Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")
然而,我得到的只是文字字符串日期。
解决方案
如果您知道该字符串绝对是一个日期,我更喜欢这样做:
new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))
其他提示
Bertrand LeRoy,曾从事 ASP.NET Atlas/AJAX 工作, 描述了 JavaScriptSerializer DateTime 输出的设计 并揭示了神秘的前斜杠和尾随斜杠的起源。他提出了这样的建议:
简单地搜索“ /date(( d+))/” /”,然后在评估之前替换为“ new Date($ 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 />");
这与许多其他答案非常接近:
- 像 Sjoerd Visscher 一样使用锚定正则表达式 - 不要忘记 ^ 和 $。
- 避免使用 string.replace 以及正则表达式中的“g”或“i”选项。“/日期(1271389496563)//日期(1271389496563)/”根本不应该工作。
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]);
ASP.net AJAX 反序列化方法中使用的正则表达式查找类似于“/Date(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);
对于那些不想使用 Microsoft Ajax 的人,只需向 string 类添加一个原型函数即可。
例如。
String.prototype.dateFromJSON = function () {
return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};
不想使用评估?尝试一些简单的事情,比如
var date = new Date(parseInt(jsonDate.substr(6)));
附带说明一下,我曾经认为微软使用这种格式具有误导性。然而,在定义 JSON 中描述日期的方法时,JSON 规范并不是很明确。
实际上,momentjs 支持这种格式,你可以这样做:
var momentValue = moment(value);
momentValue.toDate();
这将返回 javascript 日期格式的值
大数字是标准JS时间
new Date(1221644506800)
2008 年 9 月 17 日星期三 19:41:46 GMT+1000(美国东部时间)