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

标签 c# datetime json.net

我想支持使用 Newtonsoft Json 反序列化器反序列化多个自定义 DateTime 格式,所以我使用 IsoDateTimeConverter:

var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyyMMddTHHmmssZ" });

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

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

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

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

最佳答案

如果你想处理多种可能的日期格式,你需要制作一个自定义的 JsonConverter,它可以接受多种格式字符串并尝试所有格式,直到一个成功。这是一个简单的例子:

class MultiFormatDateConverter : JsonConverter
{
    public List<string> DateTimeFormats { get; set; }
    
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
    }
    
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string dateString = (string)reader.Value;
        if (dateString == null) 
        {
            if (objectType == typeof(DateTime?))
                return null;
                
            throw new JsonException("Unable to parse null as a date.");
        }
        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();
    }
}

然后你可以像这样将它添加到你的设置中:

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

fiddle :https://dotnetfiddle.net/vOpMEY

关于c# - 使用 Json.Net 反序列化时支持多种自定义 DateTime 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51318713/

相关文章:

反向的 Python 日期时间

asp.net-mvc - MVC Razor 获取月份名称

.net - 如何使用Newtonsoft将json字符串反序列化为匿名类型?

c# - 事件订阅者克隆

c# - 控制台应用程序占用大量 CPU 资源

c# - 瓦廷 : Get Row Count from table

c# - 知道 Iqueryable 的元素数量

java - 为什么我的日历总是返回当前时间?

c# - 不能在 asp.net vnext core 中使用动态类型

c# - 无法反序列化名称为 "$type"的 json 属性