Search code examples
c#json.netdeserialization

Handling Empty or invalid date in deserialisation Json.net


I am trying to deserialize a JSON object with a similar structure below

{
details:[

    {
       name:"sandeep",dob:"15/04/1984"
    },
    {
       name:"alex",dob:""
    },
    {
       name:"paul",dob:"25/02/1990"
    }]

}

This is the class to which I am trying to deserialize

class users
{
   public string name{get;set;}
   public datetime dob{get;set;}
}

This is how I am deserializing

   var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = format };
   List<users> usr = JsonConvert.DeserializeObject<List<user>>(responseBody, dateTimeConverter);

But when deserializing, its triggering

String '' was not recognised as a valid date time

So Could you please help how handle empty or invalid dates in deserializing


Solution

  • The problem is that the json may have an empty date value, so you must handle empty dates like:

    var deserializeOptions = new JsonSerializerOptions();
    deserializeOptions.Converters.Add(new MyDateTimeJsonConverter());
    
    myobject = JsonSerializer.Deserialize<users>(jsonString, 
               deserializeOptions);
    
    
    class MyDateTimeJsonConverter : JsonConverter
    {
      public override void WriteJson(JsonWriter writer, object value, JsonSerializer 
      serializer)
      {
        // implement in case you're serializing it back
      }
    
      public override object ReadJson(JsonReader reader, Type objectType, object 
        existingValue,
        JsonSerializer serializer)
      {
         var dataString = (string) reader.Value;
         // one way to handle empty/invalid dates
         return DateTime.TryParse(dateString, out var dateValue) ? dateValue : DateTime.MinValue;
      }
    
      public override bool CanConvert(Type objectType)
      {
        return objectType == typeof(DateTime);
      }
    }
    

    or make dob property a nullable like:

    class users
    {
       public string name {get; set;}
       public DateTime? dob {get; set;}
    }
    

    Regards