【问题标题】:How to make jQuery getJSON work with Json.NET JavaScriptDateTimeConverter如何使 jQuery getJSON 与 Json.NET JavaScriptDateTimeConverter 一起工作
【发布时间】:2014-03-13 08:25:38
【问题描述】:

ASP.NET 的 Json 序列化程序为 DateTime 输出“/Date(1240718400000)/”。在我的淘汰赛视图模型(使用 getJson 和淘汰赛映射器)中,我曾经使用可写计算来处理这个问题,该计算会将其转换为实际的 javascript 日期并返回。

但是,我对这个解决方案不太满意,因为它使我的视图模型过于混乱。

我决定使用 Json.NET,它是 JavaScriptDateTimeConverter,它给了我 Date(1240718400000)。从理论上讲,这很棒,因为它可以为我提供带有真实 JavaScript 日期的 observables。

实际上,我无法让它工作:(

我知道这是无效的 Json,而且 jQuery 使用的内部 Json 解析器似乎不接受这个。

有没有办法让 jQuery getJson 与 Json.NET JavaScriptDateTimeConverter 一起工作?

【问题讨论】:

  • Moment.js 支持开箱即用的 .NET DateTime 字符串:momentjs.com
  • 我不知道这一点,但不幸的是这并不能解决我的问题。我仍然需要在我的 UI 和我的视图模型之间进行可写计算,以在 javascript 日期和序列化日期之间进行转换,这就是我想要摆脱的

标签: jquery date datetime json.net getjson


【解决方案1】:

我决定采用这种方法:

我的视图模型在 DateTime 属性上有 JavaScriptDateTimeConverter

[JsonConverter(typeof(JavaScriptDateTimeConverter))]
public DateTime TheEndOfTheWorld { get; set; }

我的控制器返回一个JsonNetResult

return new JsonNetResult()
{
    Data = new MayaCalendar();
};

最后,我的 javascript 将其解析为

$.ajax({
    url: "/Calendars/Maya",
    dataType: "text",
}).done(function (data) {
    var json = eval("(" + data + ")");
    var viewmodel = new WeirdCalendarViewModel(json);
    ko.applyBindings(viewmodel);
});

简而言之:

  1. 我正在使用 JavaScriptDateTimeConverter 返回一个无效的 JSON 字符串,其中包含新的 Date(7919938800000) 而不是“/Date(7919938800000)/”

  2. 我使用 $.ajax, dataType "text" 调用该方法,因此 jQuery 不会尝试解析无效的 JSON

  3. 在将对象传递给我的淘汰视图模型之前,我自己使用 eval() 进行解析。

  4. 午餐

专业版:

  • 淘汰映射器可以使用真正的 javascript 日期,而不是字符串

缺点:

  • eval()

【讨论】:

    【解决方案2】:

    使用此函数将日期从 json 格式转换为 java 脚本日期

    function renderDate(value) {        
        var getDate;
        if (Date.parse(value)) {
            getDate = new Date(value);
        }
    
        //used for json date format like /Date(1224043200000)/
        else {
            getDate = new Date(parseInt(value.substr(6)));
        }
        //can decide the format here
        return ((getDate.getMonth() + 1) + "-" + getDate.getDate() + "-" + getDate.getFullYear());
    }
    

    【讨论】:

    • 我知道如何转换这些日期,但这不是我的问题。我希望 getJson 解析 JavaScriptDateTimeConverter 产生的无效“新日期”表示法,因此我可以使用 Knockout 映射器从真正的 javascript 日期创建一个 observable
    【解决方案3】:

    您可以在 Json.NET 中序列化以使用

    获得相同的日期格式
    JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings  {   DateFormatHandling = DateFormatHandling.MicrosoftDateFormat    };
            JsonConvert.SerializeObject(yourDataClass, microsoftDateFormatSettings);
    

    我想从那开始,作为一小步 而不是继续进行其他更改。

    【讨论】:

      【解决方案4】:

      这是一个excellent article,它为处理 JSON 日期提供了一个全局解决方案。它只处理 ISO 和 .NET (/DATE(...)/) 格式,但可以轻松修改以处理 JavaScriptDateTimeConverter 的新 Date(...) 格式。

      该解决方案通过覆盖 jquery 的 parseJSON 方法同时保持向后兼容性来实现这一点。很酷。

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 2016-03-23
        • 2013-03-07
        • 1970-01-01
        • 2013-10-03
        • 2021-09-20
        • 2013-06-30
        • 1970-01-01
        • 2010-12-06
        相关资源
        最近更新 更多