18

全部,

我们正在使用 ASP.NET Web API,其中我们有一个基于 REST 的服务,其中 JSON 用于有效负载。如果我将以下日期作为字符串传递,例如

sampleObj: {
...
myDate: "31/12/2011 00:00:00",
...
}

作为 JSON 有效负载中的属性值,日期属性被反序列化为 DateTime.MinValue。字符串格式是否有效?

我们知道“2012-10-17 07:45:00”格式可以成功序列化,但我们不能保证收到的所有日期都是这种格式。什么是有效选项?

4

2 回答 2

48

在 ASP.NET Web API 中,你可以通过 JsonFormatter 的 SerializerSettings 添加不同的 Json.NET DateTimeConverters 来让你的服务理解不同的 DateTime 格式。

但是,我认为没有来自 Json.NET 的默认 DateTimeConverter 采用这种格式“31/12/2011 00:00:00”。在这种情况下,您实现自定义 DateTimeConverter。

WebApiConfig.cs:

        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
             new IsoDateTimeConverter());
        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
             new MyDateTimeConverter());

自定义日期时间转换器:

public class MyDateTimeConverter : DateTimeConverterBase
{
    //...
}  

有关如何编写自定义 DateTimeConverter 的更多信息,我在 stackoverflow 上找到了一些您可能会觉得有用的内容: 如何创建 json.net 日期到字符串自定义转换器。

于 2012-10-17T20:49:14.893 回答
4

只需在 web.config 中设置全球化:

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" culture="en-GB" uiCulture="en-GB"/>

然后,在 Global.asax.cs > Application_Start 中,将 JsonFormatter 设置为使用当前区域性:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.Culture = System.Globalization.CultureInfo.CurrentCulture;
于 2016-01-20T16:34:33.973 回答