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" }