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

C# Web Api 2中的JSON序列化不使用ISO 8601日期,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我使用WebApi 2向客户端发送一些Json,它使用老式的日期序列化,而不是ISO 8601 我看到: "current_period_start": "\/Date(1388153705)\/", "current_period_end": "\/Date(1390832105)\/", "start": "\/Date(1388332525)\/", 我的Global.asax.cs如下所示: GlobalConfiguration.Configure(WebApiCon

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

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

或获取有关默认设置的更多信息


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

只是对@Toolkit关于格式的评论的一个简短评论

之所以会得到一个末尾没有Z的日期字符串,是因为您正在解析的datetime变量的类型未指定

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);
    }
}
您可能正在解析来自具有DateTime属性的数据库的记录,数据库字段在保存后将丢失该记录

这就是为什么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:我没有足够的分数来写评论,这不是主要问题的答案。

问题最终是使用第三方程序集的类型DateTime?直到我遇到了日期序列化问题,我才注意到。Web API返回'2016-01-01T00:00:00',这在ISO8601正则表达式fi中失败,我在末尾添加Z,它通过了@Toolkit那么你是说web api不符合ISO8601吗?原来这是因为我使用了一个可空的datetime字段。无论出于何种原因,IsoDateTimeConverter从未用于可为空的日期时间。