反序列化客户端AJAX JSON日期

时间:2008-09-17 11:09:01

标签: c# asp.net json ajax date

给出以下JSON日期表示:

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

如何将其反序列化为JavaScript日期类型表单?

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

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

但是,我得到的只是文字字符串日期。

7 个答案:

答案 0 :(得分:28)

如果你知道字符串肯定是我喜欢这样做的日期:

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

答案 1 :(得分:16)

Bertrand LeRoy,曾参与ASP.NET Atlas / AJAX,described the design of the JavaScriptSerializer DateTime output并揭示了神秘的前导和尾随斜线的起源。他提出了这个建议:

  

在eval之前运行一个简单的搜索“\ / 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 />");

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

  • 使用锚定的RegEx作为Sjoerd Visscher所做的 - 不要忘记^和$。
  • 避免使用string.replace,以及RegEx上的'g'或'i'选项。 “/日期(1271389496563)//日期(1271389496563)/”根本不适用。

答案 2 :(得分: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]);

答案 3 :(得分:5)

ASP.net AJAX deserialize方法中使用的正则表达式查找看起来像“/ 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);

答案 4 :(得分:3)

对于那些不想使用Microsoft 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规范并不十分清楚。

答案 5 :(得分:2)

实际上,momentjs支持这种格式,您可以执行以下操作:

    var momentValue = moment(value);

    momentValue.toDate();

以javascript日期格式返回值

答案 6 :(得分:1)

大数字是标准的JS时间

new Date(1221644506800)

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