JSON.NET Serialize DateTime.MinValue as null

后端 未结 2 942
忘了有多久
忘了有多久 2021-01-04 04:32

I\'d like DateTime fields that are set to DateTime.MinValue returned by my Web API to be serialized to NULL instead of \"0001-01

相关标签:
2条回答
  • 2021-01-04 05:07

    Create a custom converter which serializes DateTime.MinValue into null, and (if required) deserializes null into 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);
        }
    }
    

    You can then use attributes to add the converter to your data class, as shown in this example:

    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();
    }
    

    Console output:

    {"ValueOne":null,"ValueTwo":"2016-10-26T09:54:48.497463+01:00"}
    
    0 讨论(0)
  • 2021-01-04 05:11

    Custom DateTime Json Converter

    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);
        }
    }
    

    Usage:

    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));
    }
    

    Result:

    {
      "MyDateTime": null,
      "MyDateTime1": "9999-12-31T23:59:59.9999999"
    }
    
    0 讨论(0)
提交回复
热议问题