【问题标题】:JSON Serialization in Web Api 2 not using ISO 8601 datesWeb Api 2 中的 JSON 序列化不使用 ISO 8601 日期
【发布时间】:2013-12-29 16:41:05
【问题描述】:

我正在使用 WebApi 2 将一些 Json 发送到客户端,并使用旧式日期序列化而不是 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();

【问题讨论】:

  • 原来这是因为我使用了一个可以为空的日期时间字段。无论出于何种原因,IsoDateTimeConverter 从未用于可为空的 DateTime。

标签: c# asp.net-web-api json.net


【解决方案1】:

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

Read thisScott's blog 了解有关默认设置的更多信息

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

【讨论】:

  • 问题最终是类型,来自使用的第 3 方程序集,DateTime?直到出现日期序列化问题,我才注意到。
  • Web API 返回 '2016-01-01T00:00:00' 失败,ISO8601 正则表达式 codepen.io/anon/pen/WryLGe fi 我在最后添加 Z,它通过了。 codepen.io/anon/pen/qbKLaV
  • @Toolkit 你是说 web api 不符合 ISO8601 吗?
【解决方案2】:

简单评论一下@Toolkit 关于格式的评论。

你得到一个末尾没有 Z 的日期字符串的原因是你正在解析的 datetime 变量的 Kind 为 Unspecified。

您可能正在解析来自具有 DateTime 属性的数据库的记录,一旦保存,数据库字段就会丢失 Kind。

这就是为什么json没有在末尾添加'Z'的原因,它不知道它是utc还是local。

如果您可以更改模型而不会产生太大影响,则可以使用 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:我没有足够的分数来写评论,这不是主要问题的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2015-05-19
    • 2018-06-23
    • 2016-01-06
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多