Json自定义JsonConverter反序列化为DateTime不起作用
本文关键字:DateTime 不起作用 反序列化 自定义 JsonConverter Json | 更新日期: 2023-09-27 18:28:36
我正在尝试将Unix timestamp
反序列化为DateTime
。在我的情况下,我需要做更多的检查,然后才能从时间戳将属性设置为DateTime。如果我使用Newtonsoft.Json
中的DateTime
,它会将其反序列化为UTC
时间,并且我需要将它反序列化为特定的时区
问题是我不能得到正确的时间。我的字符串到long
的解析似乎失败了。如果我能得到long
unix时间戳,我就能得到其他逻辑工作的
我有一个名为Alert
的类
class Alert
{
// Some properties
[JsonConverter(typeof(UnixTimestampJsonConverter))]
public DateTime Created { get; set; }
// Some more properties
}
类别UnixTimestampJsonConverter
是
class UnixTimestampJsonConverter : JsonConverter
{
// Other override methods
public override object ReadJson (JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.EndObject)
return null;
if (reader.TokenType == JsonToken.StartObject) {
long instance = serializer.Deserialize<long> (reader);
return TimeUtils.GetCustomDateTime (instance);
}
return null;
}
}
其中TimeUtils.GetCustomDateTime (instance)
获取长unixtimestamp并将其转换为特定时区的DateTime对象。
我在Profile 78
的PCL库中,因此我对System.TimeZoneInfo
的访问权限有限,并且我正在使用NodaTime
的PCL版本进行其他时区计算。
如果有人感兴趣,这是Github-MBTA Sharp 上的项目
我确信您所需要做的就是调用serializer.Deserialize
。这样做将正确地推进阅读器,您不需要做任何其他事情:
public class UnixTimestampJsonConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
long ts = serializer.Deserialize<long>(reader);
return TimeUtils.GetMbtaDateTime(ts);
}
public override bool CanConvert(Type type)
{
return typeof(DateTime).IsAssignableFrom(type);
}
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanRead
{
get { return true; }
}
}
示例:https://dotnetfiddle.net/Fa8Zis