使用 Nullable DateTime 属性 反序列化 JSON 会抛出 Newtonsoft.Json.JsonReaderException

Deserializing JSON with Nullable DateTime property throws Newtonsoft.Json.JsonReaderException

我正在尝试反序列化以下 JSON 字符串

[
  {
    "gerceklesenTarih": 1487710800000,
    "deletedDate": null
  }
]

到下面的 Dto 对象(我简化了 class 以进行说明)。

public class Dto
{
   public DateTime? gerceklesenTarih { get; set; }
   public DateTime? deletedDate { get; set; }
}

代码:

if(File.Exists("aa - Copy.txt"))
{
     var OdemePlaniStr = File.ReadAllText("aa - Copy.txt");
     var settings = new JsonSerializerSettings
     {                    
         Converters = { new DateTimeConverter() },
     };
     var resultOdemePlani = JsonConvert.DeserializeObject<List<Dto>>(OdemePlaniStr, settings);
}

由于我使用的 JSON 对象发送日期时间值,所以我必须使用下面的转换器 class

    public class DateTimeConverter : Newtonsoft.Json.JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(DateTime);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            try
            {
                var t = (long)reader.Value;
                //return DateTime.Parse(t.ToString());
                return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(t);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteValue(Convert.ToInt64(((DateTime)value - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds));
        }
    }

反序列化非可为空的 DateTime 字段没有问题,但是当 JSON 对象在其可为空的 DateTime 字段中有一个值时,它会抛出:

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: 1. Path '[0].gerceklesenTarih', line 4, position 25.'

当我调试代码时,它没有命中 DateTimeConverter class,即使它应该命中。另外下面的符号有效

"gerceklesenTarih": "/Date(1487710800000)/"

可能是什么原因?

我想通了,忘了在 DateTimeConverter 的 CanConvert 方法中添加可空类型

public override bool CanConvert(Type objectType)
{
    return objectType == typeof(DateTime);
}

现在按预期工作