如何使jQuery getJSON与Json.NET JavaScriptDateTimeConverter一起使用

时间:2014-03-13 08:25:38

标签: jquery date datetime json.net getjson

ASP.NET的Json序列化程序吐出" /日期(1240718400000)/"对于DateTime。在我的Knockout viewmodel(使用getJson和knockout mapper)中,我曾经用一个可写的计算器处理这个问题,将其转换为实际的javascript日期并返回。

但是,我对此解决方案并不满意,因为它太过混乱了我的视图模型。

我决定使用Json.NET和它的JavaScriptDateTimeConverter,它给了我Date(1240718400000)。理论上这很棒,因为它会给我带来真正的javascript日期的可观察性。

在实践中,我无法让它发挥作用:(

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

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

4 个答案:

答案 0 :(得分:2)

我决定采用这种方法:

我的viewmodel在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字符串,其中包含新日期(7919938800000)而不是" / Date(7919938800000)/"

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

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

  4. 午餐

  5. 临:

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

    缺点:

    • 的eval()

答案 1 :(得分:0)

使用此函数将日期从json格式转换为javascript日期

答案 2 :(得分:0)

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

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

我认为从这开始,只是一小步 而不是继续其他变化。

答案 3 :(得分:0)

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

该解决方案通过覆盖jquery的parseJSON方法实现此目的,同时保持向后兼容性。很酷。