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

Posted

技术标签:

【中文标题】使用 Javascript/JQuery 解析自动生成的 .NET 日期对象【英文标题】:Parsing a Auto-Generated .NET Date Object with Javascript/JQuery 【发布时间】:2011-08-05 02:45:39 【问题描述】:

有一些关于这个的帖子,但不是这个特定问题的答案。

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

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

从以前的帖子看来,这可以使用 REGEX 来完成,但 REGEX 和我是老对手,隔着酒吧冷冷地盯着对方看。

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

问候,

圭多

【问题讨论】:

【参考方案1】:

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

这是一个可以满足您需要的快速功能。 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)/");

【讨论】:

当然,如果您在理解 RegEx 方面需要帮助,请回复,如果您不关心,那也没关系 :) @Juan:实际上你的 RegEx 应该是:/\/Date\((\d+)(?:-\d+)?\)\//i,因为它可以从服务器返回(当然,忽略大小写开关不是强制性的)。 @Guido:我已经更新了我的答案,为什么从可维护性的角度来看这个解决方案很糟糕。只是为了让您知道并从长远来看。 @Juan - 我对学习 RegEx 很好奇,但不想浪费你的时间。如果您对我的收藏夹/书签栏有很好的 REGEX 参考,我会在下次添加它。 @Robert:作为帮助我更好地理解 REGEX 的一种方式,您能否解释一下您对 Juan 的原始 REGEX 所做的更改是什么?再次感谢。【参考方案2】:

由于您使用的是 jQuery,我已经扩展了它的 $.parseJSON() 功能,因此它能够自动且透明地为您进行这种转换。

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

阅读my blog post中的所有详细信息(不要在此处复制博客文章内容,因为它会太多)并获取代码。这个想法还是一样的:改变 jQuery 的默认 $.parseJSON() 行为,这样它就可以检测 .Net 和 ISO 日期,并在解析 JSON 数据时自动转换它们。这样您就不必遍历已解析的对象并手动转换日期。

它是如何使用的?

$.parseJSON(yourJSONstring, true);

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

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

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

我想到的两个主要原因。

当覆盖 jQuery 功能感觉不对时

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

好在你没有改变原来的 jQuery 库代码文件。您将此扩展名放在一个单独的文件中,并按照自己的意愿使用它。有些页面可能会使用它,而其他页面可能不会。但是在任何地方都使用它是明智的,否则你会遇到同样的人为因素问题,忘记包含扩展名。只需将您的扩展程序包含在您可能正在使用的一些全局 javascript 文件(或母版页/模板)中。

【讨论】:

谢谢。更改 JQuery $ 函数让我有点紧张。这并不是说我不应该这样做,这只是我不习惯做的事情。 (前 Java/Java EE 开发人员)。不要让我继续说 Javascript 是如何让我感到害怕的。 ;) @Guido:您实际上并没有更改原始 jQuery 文件。 不!上帝保佑!你只覆盖它的实现。博文中提供的大部分代码都取自原始 jQuery 代码。您将此覆盖放在一个单独的文件中,因此更新 jQuery 库也更容易,因为您仍在使用原始文件。我实际上只添加了日期检测和智能转换。 明白了。如果我切换到更新版本的 JQuery 会怎样?这会带来兼容性问题吗? Juan 的解决方案的好处在于它不同于 JQuery 本身的实现。

以上是关于使用 Javascript/JQuery 解析自动生成的 .NET 日期对象的主要内容,如果未能解决你的问题,请参考以下文章

javascript JQuery:URL解析器

一旦用户输入值,使用 javascript/jquery 自动更新具有相同 ID 的输入字段

创建后自动删除元素(Javascript / Jquery)[关闭]

javascript jQuery动画自动高度

javascript jquery中的自动十进制数输入

是否可以在 javascript/jquery 中创建一个空的多维数组?