我认为你把事情过于复杂化了。您的转换器应该只关心转换日期值,而不是可能包含日期值的对象。每当在任何其他对象中遇到日期时,序列化程序都会自然地调用您的转换器。
这是一个简单的转换器,可以满足您的要求:
public class MinDateToNullConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
// This converter handles date values directly
return (objectType == typeof(DateTime));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// The CanConvert method guarantees the value will be a DateTime
DateTime date = (DateTime)value;
if (date == DateTime.MinValue)
{
writer.WriteNull();
}
else
{
writer.WriteValue(date);
}
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
下面是一个演示,显示转换器可以处理对象嵌套层次结构中的日期:
class Program
{
static void Main(string[] args)
{
Example example = new Example
{
Date1 = new DateTime(2014, 2, 2),
Date2 = DateTime.MinValue,
Inner = new Inner
{
DateA = DateTime.MinValue,
DateB = new DateTime(1954, 1, 26)
},
MoreDates = new List<DateTime>
{
new DateTime(1971, 11, 15),
DateTime.MinValue
}
};
// Set up the serializer to use our date converter
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new MinDateToNullConverter());
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(example, settings);
Console.WriteLine(json);
}
}
class Example
{
public DateTime Date1 { get; set; }
public DateTime Date2 { get; set; }
public Inner Inner { get; set; }
public List<DateTime> MoreDates { get; set; }
}
class Inner
{
public DateTime DateA { get; set; }
public DateTime DateB { get; set; }
}
Output:
{
"Date1": "2014-02-02T00:00:00",
"Date2": null,
"Inner": {
"DateA": null,
"DateB": "1954-01-26T00:00:00"
},
"MoreDates": [
"1971-11-15T00:00:00",
null
]
}