Web API 2 中的 JSON 序列化不使用 ISO 8601 日期



我正在使用WebApi 2将一些Json发送到客户端,并且它使用旧样式Date序列化而不是ISO 8601。

我看到:

"current_period_start": "/Date(1388153705)/",
"current_period_end": "/Date(1390832105)/",
"start": "/Date(1388332525)/",

我的 Global.asax.cs 看起来像这样:

        GlobalConfiguration.Configure(WebApiConfig.Register);
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;
        settings.Converters.Add(new IsoDateTimeConverter());
        settings.Formatting = Formatting.Indented;
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

Newtonsoft.Json 默认为 IsoDateTimeConverter。因此,即使您没有指定任何内容,也应该获得正确的 ISO 格式(对我来说,您的代码也可以正常工作)。

阅读此内容或 Scott 的博客,了解有关默认值的更多信息

很可能再次在其他地方设置转换器,也许您正在使用一些具有特定设置的自定义转换器?或者你使用的是非常旧版本的Newtonsoft.Json?

只是对@Toolkit关于格式的评论的快速评论。

您得到一个末尾没有 Z 的日期字符串的原因是,您正在解析的日期时间变量的种类为未指定。

很可能

您正在分析来自具有 DateTime 属性的数据库的记录,数据库字段在保存后会丢失 Kind。

这就是为什么 json 没有在末尾添加"Z",它不知道它是 UTC 还是本地的。

您可以使用 DatetimeOffset 而不是 Datetime,如果可以更改模型而不会产生太大影响。我的选择是为 Datetime 编写一个自定义解析器,如果未指定,则强制其为 UTC。

public class CustomJsonDateConverter : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var date = DateTime.Parse(reader.Value.ToString());
        if (date.Kind == DateTimeKind.Unspecified)
        {
            date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
        }
        return date;
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var date = (DateTime)value;
        if (date.Kind == DateTimeKind.Unspecified)
        {
            date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
        }
        writer.WriteValue(date);
    }
}

PD:我没有足够的观点来写评论,这不是主要问题的答案。

相关内容

  • 没有找到相关文章

最新更新