Json自定义JsonConverter反序列化为DateTime不起作用

本文关键字:DateTime 不起作用 反序列化 自定义 JsonConverter Json | 更新日期: 2023-09-27 18:28:36

我正在尝试将Unix timestamp反序列化为DateTime。在我的情况下,我需要做更多的检查,然后才能从时间戳将属性设置为DateTime。如果我使用Newtonsoft.Json中的DateTime,它会将其反序列化为UTC时间,并且我需要将它反序列化为特定的时区

问题是我不能得到正确的时间。我的字符串到long的解析似乎失败了。如果我能得到longunix时间戳,我就能得到其他逻辑工作的

我有一个名为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 上的项目

Json自定义JsonConverter反序列化为DateTime不起作用

我确信您所需要做的就是调用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