Newtonsoft.json IsoDateTimeConverter和DateFormatHandling

时间:2015-08-21 11:01:19

标签: json serialization json.net deserialization asp.net-web-api2

这不是问题,而是我想说清楚的概念。 使用asp.net web api时,我们使用Newtonsoft.Json的 SerializerSettings 。在此设置中,我们可以设置

jsonSetting.Converters.Add(new IsoDateTimeConverter());
jsonSetting.DateFormatHandling = DateFormatHandling.IsoDateFormat;

我理解 IsoDateTimeConverter 正在做什么,但不清楚 DateFormatHandling.IsoDateFormat 。如果你仍然使用 IsoDateTimeConverter ,似乎没有 DateFormatHandling.MicrosoftDateFormat 的影响。

除了一些了解此事的解释之外。

1 个答案:

答案 0 :(得分:3)

你实际上有几个不同的相关问题。让我们分解它们:

当我为Json.NET本机支持的类型添加转换器时会发生什么?

如果您这样做,您的转换器将取代本机Json.NET功能。例如,您可以replace its serialization of byte [] fields。或者您可以更改它序列化和反序列化数字的方式:这个稍微愚蠢的转换器通过添加1来序列化整数:

public class IntConverter : JsonConverter
{ 
    public override bool CanConvert(Type objectType) { return objectType == typeof(int); }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return (int)JValue.Load(reader) - 1;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(1 + (int)value);
    }
}

为什么Json.NET提供各种DateTime转换器以及多种DateTime格式的原生支持?

文档Serializing Dates in JSON

中对此进行了解释
  

JSON中的DateTimes很难。

     

问题来自JSON规范本身:JSON中没有日期的文字语法。规范包含对象,数组,字符串,整数和浮点数,但它没有为日期定义标准。

对日期的本机支持处理一些常见的格式;如果您有其他格式的日期,则可以从DateTimeConverterBase派生。 (有关示例,请参阅How to convert new Date(year, month, day) overload with JSON.Net。)完成此操作后,您的转换器将取代DateFormatHandling指定的本机转换。

为什么Json.NET的类IsoDateTimeConverter似乎与DateFormatHandling.IsoDateFormat的功能重复?

这是一个遗留类。来自Serializing Dates in JSON

  

从Json.NET 4.5开始,默认情况下使用ISO 8601格式编写日期,并且不需要使用此转换器。