使用Json.Net反序列化时支持多种自定义DateTime格式

Yah*_*ein 4 c# datetime json.net

我想支持使用Newtonsoft Json反序列化器反序列化多个自定义DateTime格式,因此我正在使用IsoDateTimeConverter

var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyyMMddTHHmmssZ" });
Run Code Online (Sandbox Code Playgroud)

由于该DateTimeFormat属性不接受格式数组,因此我尝试了以下方法来支持多种自定义日期格式:

var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyyMMddTHHmmssZ" });
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-ddTHH:mm" });
Run Code Online (Sandbox Code Playgroud)

但是,以上代码的结果仅支持反序列化第一种格式。

如何实现对多种自定义DateTime格式的支持?

Bri*_*ers 5

如果要处理多种可能的日期格式,则需要进行一个自定义JsonConverter以接受多种格式的字符串,并尝试所有这些字符串,直到成功为止。这是一个简单的示例:

class MultiFormatDateConverter : JsonConverter
{
    public List<string> DateTimeFormats { get; set; }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string dateString = (string)reader.Value;
        DateTime date;
        foreach (string format in DateTimeFormats)
        {
            // adjust this as necessary to fit your needs
            if (DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                return date;
        }
        throw new JsonException("Unable to parse \"" + dateString + "\" as a date.");
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其添加到您的设置中,如下所示:

var settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
settings.Converters.Add(new MultiFormatDateConverter 
{ 
    DateTimeFormats = new List<string> { "yyyyMMddTHHmmssZ", "yyyy-MM-ddTHH:mm" } 
});
Run Code Online (Sandbox Code Playgroud)

小提琴:https : //dotnetfiddle.net/vOpMEY