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

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

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

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

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

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

问候,

圭多

【问题讨论】:

    标签: c# javascript jquery .net date


    【解决方案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,它将检测日期并相应地转换它们。

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

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

    我想到的两个主要原因。

    当覆盖 jQuery 功能感觉不对时

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

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

    【讨论】:

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