c# - 使用 Json.Net 反序列化时支持多种自定义 DateTime 格式
问题描述
我想支持使用 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" }
});
推荐阅读
- r - 每天选择一天中的一小时进行分析
- c# - 在服务器中完成连接字符串的加密?
- server - 如果我在我的服务器中删除 Vesta Panel 会发生什么?
- python - 如何在__init__中获取python类实例变量?
- arrays - VBA Excel,形状数组。如何修复错误“指定集合的索引超出范围”?
- ios - iOS 12.2:CMMotionManager 阻塞了主线程
- apache - 如何在 AWS EC2 Cloud9 上运行 Apache
- reactjs - “ react-infinite-scroll-component ” 迁移到 React Routes 后停止工作
- c++ - 提高 Blob 上传性能
- ios - 我可以通过在 swift 中单击我的应用程序中的按钮将图片发布为 whatsapp 状态、信使或 instagram 故事吗