在使用json.net序列化和反序列化DateTime类型数据的时候,经常会碰到一些麻烦。比如不同的接口需要的日期显示格式不同,对数据库中空值和日期最小值的处理。
先看下面的例子,需要序列化和反序列化的类如下
public class ArchiveModel
{
public long ArchiveId { get; set; }
public long ProjectId { get; set; }
public DateTime CProcedureCompleteDate { get; set; }
public bool IsMaterialCertificationTidy { get; set; }
public DateTime CompletionDrawingReportDate { get; set; }
public DateTime CompletionDrawingGetDate { get; set; }
public DateTime CompletionMaterialDate {get; set; }
}
如果我们希望此类序列化出的日期,以yyyy/MM/dd的形式展现,并且日期数据如果为0001/01/01的DateTime最小值,则显示空字符串,该如何处理?
Json.net允许以特性标注的形式为属性指定特定的Converter。首先创建自定义Converter
public class CustomDateConverter :DateTimeConverterBase
{
private IsoDateTimeConverter dtConverter;
public EasyUIDateConverter()
{
dtConverter = new IsoDateTimeConverter { DateTimeFormat ="yyyy/MM/dd" };
}
public override object ReadJson(JsonReader reader, Type objectType,object existingValue, JsonSerializer serializer)
{
if (!string.IsNullOrEmpty(reader.Value.ToString()))
{
returndtConverter.ReadJson(reader, objectType, existingValue, serializer);
}
else
{
return DateTime.MinValue;
}
}
public override void WriteJson(JsonWriter writer, object value,JsonSerializer serializer)
{
if ((DateTime)value == DateTime.MinValue)
{
newStringEnumConverter().WriteJson(writer, null, serializer);
}
else
{
dtConverter.WriteJson(writer,value, serializer);
}
}
}
然后在需要使用此Converter的实体类属性上进行标注
public classArchiveModel
{
public long ArchiveId { get; set; }
public long ProjectId { get; set; }
[JsonConverter(typeof(EasyUIDateConverter))]
public DateTime CProcedureCompleteDate{ get; set; }
public bool IsMaterialCertificationTidy{ get; set; }
[JsonConverter(typeof(EasyUIDateConverter))]
public DateTime CompletionDrawingReportDate{ get; set; }
[JsonConverter(typeof(EasyUIDateConverter))]
public DateTimeCompletionDrawingGetDate { get; set; }
[JsonConverter(typeof(EasyUIDateConverter))]
public DateTime CompletionMaterialDate{ get; set; }
}
对于其他类型的数据,也可以使用此方法进行格式化和转换。
Json.net中提供的很多类似的特性,只要善于发现!