使用Javascript / JQuery解析自动生成的.NET日期对象

这里有一些post,但不是这个具体问题的答案。

服务器返回: "/Date(1304146800000)/"

我想根本不更改服务器端代码,而是解析.Net生成的JSON对象中包含的日期。 这似乎并不那么难,因为它看起来几乎就在那里。 然而,至少在这些论坛中似乎没有快速解决方案。

从以前的post中可以看出这可以使用REGEX来完成,但是REGEX和我是老对手,他们在酒吧里冷冷地凝视着对方。

这是唯一的方法吗? 如果是这样,有人可以指向我适合此任务的REGEX参考吗?

问候,

圭多

罗伯特的链接很好,但我们应该努力回答这里的问题,而不仅仅是发布链接。

这是一个快速的function,可以满足您的需求。 http://jsfiddle.net/Aaa6r/

 function deserializeDotNetDate(dateStr) { var matches = /\/Date\((\d*)\)\//.exec(dateStr); if(!matches) { return null; } return new Date( parseInt( matches[1] ) ); } deserializeDotNetDate("/Date(1304146800000)/"); 

由于您正在使用jQuery,我已经扩展了它的$.parseJSON()function,因此它可以自动且透明地为您执行此转换。

它不仅转换.net日期,也转换ISO日期。 所有主流浏览器中的原生JSON转换器都支持ISO日期,但它们只能以一种方式工作,因为JSON规范不支持日期数据类型。

在我的博客文章中阅读所有细节(不想复制博客文章内容,因为它太多了)并获取代码。 这个想法仍然是一样的:更改jQuery的默认$.parseJSON()行为,以便它可以检测.Net和ISO日期,并在解析JSON数据时自动转换它们。 这样您就不必遍历解析的对象并手动转换日期。

怎么用?

 $.parseJSON(yourJSONstring, true); 

看到附加变量? 这可以确保所有现有代码按预期工作而不进行任何更改。 但是如果你确实提供了附加参数并将其设置为true ,它将检测日期并相应地转换它们。

为什么这个解决方案比手动转换更好? Juan建议

  1. 因为你降低了忘记转换对象树中某些变量的人为因素的风险(对象可以是深度和宽度)
  2. 因为您的代码处于开发阶段,并且如果您更改了一些将JSON返回给客户端的服务器端部件(重命名变量,添加新变量,删除现有等),您还必须在客户端考虑这些手动转换。 如果您自动执行此操作,则无需考虑(或做任何事情)。

最重要的两个原因来自我的头脑。

当重写jQueryfunction时感觉不对

当您不想实际覆盖现有的$.parseJSON()function时,您可以最小化地更改代码并将扩展名重命名为$.parseJSONwithdates() ,然后在解析JSON时始终使用您自己的函数。 但是,当您将Ajax调用设置为dataType: "json"时,您可能会遇到问题dataType: "json"会自动调用原始解析器。 如果使用此设置,则必须覆盖jQuery的现有function。

好处是你不要改变原来的jQuery库代码文件。 您将此扩展名放在单独的文件中,并根据您的意愿使用它。 有些页面可能会使用它,有些页面可能不会。 但是在任何地方使用它都是明智的,否则你会遇到与人为因素相同的问题而忘记包含扩展名。 只需将您的扩展名包含在您可能正在使用的某个全局Javascript文件(或母版页/模板)中。