在WebAPI中修改JSON.NET

时间:2013-07-25 20:05:48

标签: jquery datetime asp.net-web-api json.net

我修改了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);
        }
    });

错误:输入,textStatus是parseerror,errorThrown给我这个信息: SyntaxError:JSON.parse:意外关键字 return window.JSON.parse(data); 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 forms)中的表现:

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Converters.Add(new JavaScriptDateTimeConverter());

1 个答案:

答案 0 :(得分:2)

使用标准日期转换器,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无法反序列化这种格式,并会抛出错误。

据我了解,如果您打算将数据作为文本获取,然后将其传递给JavaScriptDateTimeConverter,那么您将使用exec(),以便将整个字符串直接解释为JavaScript。

var obj = eval('(' + data + ')');

尽管存在安全问题,但这可能不是最佳解决方案。

如果您需要通过jQuery将日期反序列化为Date个对象,我认为您最好的选择是坚持使用ISO 8601格式,然后使用jQuery扩展来在客户端进行转换。这是一个blog post,讨论如何执行此操作并具有一些代码。 [免责声明:我自己没有使用过这个解决方案,也无法保证它是否有效。]

另外,请参阅this question,它提供了许多解决此问题的方法。