【问题标题】:Modifying JSON.NET in WebAPI在 WebAPI 中修改 JSON.NET
【发布时间】:2013-07-25 22:04:57
【问题描述】:

我已修改 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:意外关键字 返回 window.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"

所以它确实按照要求格式化了我的日期,但稍后解析失败。

有什么想法可以实现我想要的吗?

附言这就是我在 global.asax(asp.net 网络表单)中的做法:

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

【问题讨论】:

  • 为什么需要/想要在 Web API 中使用 JavaScriptDateTimeConverter?如果您将其保留为 ISO 8601 日期,则在 jQuery 反序列化响应后,您只需执行 var date = new Date(data.CreatedOn); 即可将日期字符串转换为 Date 对象。
  • 问题是我们之前使用了 Web 方法,现在我们正在将该代码移动到 WebAPI。所以我不得不手动更改很多 jscript 代码。
  • 在您迁移到 Web API 之前,您的旧 Web 方法是如何格式化日期的?
  • CreatedOn=/Date(1374749676000)/ 是之前返回的方式,我也可以在 WebAPI 中完成。当我用 WebAPI 返回它时,它保持不变。但是当它从 web 方法返回时,它被转换为 jscript 对象?!
  • 其实 WebAPI 返回:"\/Date(1374749676000)\/" 问题出在哪里?

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


【解决方案1】:

使用标准日期转换器,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(),则可以使用JavaScriptDateTimeConverter,以便将整个字符串直接解释为JavaScript。

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

出于安全考虑,这可能不是最佳解决方案。

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

另外,请参阅this question,它提供了许多不同的方法来解决这个问题。

【讨论】:

  • 感谢您的帮助,我们决定使用 iso8601 :)。那篇博文的一个问题是它不适用于复杂的对象。因此,如果我们有一个对象,其参数之一为 date 类型,则该解决方案不会遍历所有属性,而是只会返回 null。但如果有人想自己编写解析器,这是一个有用的参考......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
相关资源
最近更新 更多