ASP.NET的Json序列化程序为DateTime吐出"/Date(1240718400000(/"。在我的Knockout视图模型(使用getJson和Knockout映射器(中,我曾经用一个可写的计算来处理这个问题,该计算会将其转换为实际的javascript日期和日期。
然而,我对这个解决方案不太满意,因为它太扰乱了我的视图模型。
我决定使用Json.NET,它是JavaScriptDateTimeConverter,它给了我日期(1240718400000(。从理论上讲,这很好,因为它可以为我提供真实javascript日期的可观察性。
在实践中,我无法让它发挥作用:(
我知道这是无效的Json,而且jQuery使用的内部Json解析器似乎不接受这一点。
有没有办法让jQuery getJson与Json.NET JavaScriptDateTimeConverter一起工作?
我决定采用这种方法:
我的视图模型在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);
});
简而言之:
我使用JavaScriptDateTimeConverter返回一个无效的JSON字符串,该字符串包含新的Date(7919938800000(,而不是"/Date(791993880000(/">
我用$.ajax调用该方法,dataType为"text",这样jQuery就不会试图解析无效的JSON
在将对象传递给淘汰视图模型之前,我使用eval((自己进行解析。
午餐
Pro:
- 敲除映射器可以使用真正的javascript日期,而不是字符串
Con:
- eval((
使用此函数将日期从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());
}
您可以在Json.NET中进行序列化,以使用获得相同的日期格式
JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat };
JsonConvert.SerializeObject(yourDataClass, microsoftDateFormatSettings);
我认为从那开始,作为一小步而不是继续其他的变化。
这是一篇优秀的文章,它提供了一个处理JSON日期的全局解决方案。它只处理ISO和.NET(/DATE(…(/(格式,但也可以很容易地进行修改以处理JavaScriptDateTimeConverter的新DATE(…(格式。
该解决方案通过覆盖jquery的parseJSON方法来实现这一点,同时保持向后兼容性。很酷。