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