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

我试图将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 (reader); return TimeUtils.GetCustomDateTime (instance); } return null; } } 

其中TimeUtils.GetCustomDateTime (instance)获取长unixtimestamp并将其转换为特定时区的DateTime对象。

我在Profile 78的PCL库中,所以我对System.TimeZoneInfo访问权限有限,我使用PCL版本的NodaTime进行其他时区计算。


如果有人感兴趣,这是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(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