当前位置:  开发笔记 > 编程语言 > 正文

反序列化客户端AJAX JSON日期

如何解决《反序列化客户端AJAXJSON日期》经验,为你挑选了4个好方法。

给定以下JSON日期表示:

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

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

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

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

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



1> Simon_Weaver..:

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

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


谢谢.`var date = new Date(parseInt(jsonDate.substr(6)));`也可以.

2> ESV..:

负责ASP.NET Atlas/AJAX的Bertrand LeRoy 描述了JavaScriptSerializer DateTime输出的设计,并揭示了神秘的前导和尾随斜线的起源.他提出了这个建议:

在eval之前运行一个简单的搜索"\/Date((\ d +))\ /"并替换为"new Date($ 1)"(但在验证之后)

我将其实现为:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "
"); 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) + "
");

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

使用锚定的RegEx作为Sjoerd Visscher所做的 - 不要忘记^和$.

避免使用string.replace,以及RegEx上的'g'或'i'选项."/日期(1271389496563)//日期(1271389496563)/"根本不起作用.


该正则表达式不适用于具有负值的纪元之前的日期.你需要这样的东西:`/\/ Date \(( - ?\ d +)(?: - \d +)?\)\ // i`

3> Sjoerd Vissc..:

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



4> 小智..:

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

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有