JSON.NET将DateTime.MinValue序列化为null

我想将设置为我的Web API返回的DateTime字段序列化为NULL而不是"0001-01-01T00:00:00"

我知道有一种方法可以让JSON.NET省略设置为默认值的字段,但我更喜欢JSON.NET将DateTime MinValue / "0001-01-01T00:00:00" as null专门序列化为DateTime MinValue / "0001-01-01T00:00:00" as null

有没有办法做到这一点?

创建一个自定义转换器,将DateTime.MinValue序列化为null ,并且(如果需要)将null反序列化为DateTime.MinValue

 public class MinDateTimeConverter : DateTimeConverterBase { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.Value == null) return DateTime.MinValue; return (DateTime)reader.Value; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DateTime dateTimeValue = (DateTime)value; if (dateTimeValue == DateTime.MinValue) { writer.WriteNull(); return; } writer.WriteValue(value); } } 

然后,您可以使用属性将转换器添加到数据类中,如以下示例所示:

 public class Example { [JsonConverter(typeof(MinDateTimeConverter))] public DateTime ValueOne { get; set; } [JsonConverter(typeof(MinDateTimeConverter))] public DateTime ValueTwo { get; set; } } public static void Main(string[] args) { Example data = new Example(); data.ValueOne = DateTime.MinValue; data.ValueTwo = DateTime.Now; JsonSerializer serializer = new JsonSerializer(); using (StringWriter writer = new StringWriter()) { serializer.Serialize(writer, data); Console.Write(writer.ToString()); } Console.ReadKey(); } 

控制台输出:

 {"ValueOne":null,"ValueTwo":"2016-10-26T09:54:48.497463+01:00"} 

自定义DateTime Json转换器

 public class DateTimeConverter : JsonConverter { public override void WriteJson(JsonWriter jsonWriter, object inputObject,JsonSerializer jsonSerializer) { // Typecast the input object var dateTimeObject = inputObject as DateTime?; // Set the properties of the Json Writer jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented; if(dateTimeObject == DateTime.MinValue) jsonWriter.WriteValue((DateTime?)null); else jsonWriter.WriteValue(dateTimeObject); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { DateTime? readValue = reader.ReadAsDateTime(); return (readValue == null) ? DateTime.MinValue : readValue; } public override bool CanConvert(Type objectType) { return typeof(DateTime?).IsAssignableFrom(objectType); } } 

用法:

 public class DateTest { [JsonConverterAttribute(typeof(DateTimeConverter))] public DateTime? MyDateTime { get; set;} [JsonConverterAttribute(typeof(DateTimeConverter))] public DateTime? MyDateTime1 { get; set; } } void Main() { DateTest dateTest = new DateTest { MyDateTime = DateTime.MinValue, MyDateTime1 = DateTime.MaxValue }; Console.WriteLine(JsonConvert.SerializeObject(dateTest)); } 

结果:

 { "MyDateTime": null, "MyDateTime1": "9999-12-31T23:59:59.9999999" }