使用 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);
}
现在按预期工作
我正在尝试反序列化以下 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);
}
现在按预期工作