![](/img/trans.png)
[英]Custom JsonConverter attributes not working with Json.Serialize() using Newtonsoft.JSON in ASP.NET Core 3.1
[英]NewtonSoft.Json custom JsonConverter deserialize to DateTime not working
我試圖將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
訪問權限有限,我使用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<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; }
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.