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

时间:2013-12-29 16:41:05

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

我正在使用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();

2 个答案:

答案 0 :(得分:3)

Newtonsoft.Json默认为IsoDateTimeConverter。所以,即使你没有指定任何东西,你也应该得到正确的Iso格式(对我而言,你的代码也可以正常工作。)

Read thisScott's blog了解有关默认值

的更多信息

您最有可能再次将转换器设置在其他位置,也许您正在使用某些具有特定设置的自定义转换器?或者您使用的是旧版本的Newtonsoft.Json?

答案 1 :(得分:1)

快速评论@ Toolkit关于格式化的评论。

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

您可能正在使用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:我没有足够的积分来发表评论,这不是主要问题的答案。