我修改了WebAPI JSON.Net序列化以使用JavaScriptDateTimeConverter。计划是获取jscript日期对象,而不是ISO 8601格式的字符串。但不幸的是,当我用jquery发布请求时,如下所示:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "#UrlToService",
dataType: "json",
data: JSON.stringify(args),
success: function (data) {
callSucceeded(data);
},
error: function (jqXHR, textStatus, errorThrown) {
BJ.GenericWebAPIFailMethod(jqXHR);
}
});
error:已输入,textStatus为parseerror,errorThrown正在向我提供以下信息:SyntaxError:JSON.parse:意外关键字返回窗口。JSON.parse(数据);jquery-1.7.2.js(564行)
我返回的json对象的一部分看起来像:
"CreatedOn": Date {Thu Jul 25 2013 12:54:36 GMT+0200 (Central Europe Standard Time)}
"DisplayName": "Toronto, ON, Canada"
"Description": "12:54"
因此,它确实按照请求格式化了我的日期,但稍后解析时失败了。
有没有想过如何实现我想要的?
p.s.我就是这样做的,在global.asax(asp.net web表单)中:
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Converters.Add(new JavaScriptDateTimeConverter());
使用标准日期转换器,WebAPI将日期序列化为ISO 8601格式或Microsoft格式的字符串,具体取决于序列化程序的DateFormatHandling
设置。
使用IsoDateFormat
,JSON将如下所示:
{ "CreatedOn" : "2013-07-26T10:33:16Z" }
使用MicrosoftDateFormat
,JSON将如下所示:
{ "CreatedOn" : "/Date(1374749676000)/" }
在客户端,jQuery可以反序列化包含这两种日期格式之一的JSON,但它不会自动将日期字符串转换为Date
对象,正如您所看到的那样。
如果您将服务器上的标准日期转换器换成JavaScriptDateTimeConverter
,那么JSON将改为如下呈现:
{ "CreatedOn" : new Date(1374749676000) }
从技术上讲,这是无效的JSON(请注意,JSON没有引号,除了字符串之外,没有任何其他方式来表示日期)。jQuery无法反序列化此格式,并将引发错误。
据我所知,如果您打算将数据作为文本获取,然后将其传递给exec()
,以便将整个字符串直接解释为JavaScript,那么您将使用JavaScriptDateTimeConverter
。
var obj = eval('(' + data + ')');
尽管出于安全考虑,这可能不是最好的解决方案。
如果您需要通过jQuery将日期反序列化为Date
对象,我认为您最好的选择是坚持ISO 8601格式,然后使用jQuery扩展在客户端进行转换。这是一篇关于如何做到这一点的博客文章,其中有一些代码。【免责声明:我自己没有使用过这个解决方案,也不能保证它是否有效。】
另外,请看这个问题,它提供了许多不同的方法来解决这个问题。