有时,我需要发送一个简单的电子邮件给客户与数据,我们存储在对象。 然而,对象的日期时间存储为long? Unix时间戳。 显然,这种格式对于普通人来说是不可读的,因此必须将其转换为用户可以理解的格式。 我不能将时间戳的类型从long更改为DateTime,因为这会在许多地方破坏代码。 到目前为止,我可以想出一个解决方案,它将自定义转换器用于JSON序列化程序。 但是,我不想打破反序列化过程的逻辑。 我很想省略在转换器中实现读函数,但如果这样做,就会出现错误。 我要做的只是返回读者的值? 我想?
有人能说这段代码是否不会破坏JSONSerializer的反序列化过程吗? 否则就很糟糕了。
或者,在JSON文件中,是否有更好的解决方案可以将长数字替换为漂亮的日期?
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class EpochToDateJSONSerializeConverter : JsonConverter<long?>
{
public override long? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if(reader.TryGetInt64(out long currentValue))
{
return currentValue;
}
return null;
}
public override void Write(Utf8JsonWriter writer, long? value, JsonSerializerOptions options)
{
if (value.HasValue)
{
long unixTimeStamp = value.Value;
DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime();
writer.WriteStringValue(dtDateTime.ToString());
}
else
{
writer.WriteStringValue("null");
}
}
}
我一直在一个简单的汽车类上测试转换器。 重要的是只选长? 属性更改为“漂亮的日期”,其他属性保持不变。
public class Car
{
public string Name { get; set; }
public long? Kilometrage { get; set; }
[JsonConverter(typeof(EpochToDateJSONSerializeConverter))]
public long? ProductionDate { get; set; }
}
在Main中:
Car car = new Car() { Name = "MyCar", Kilometrage = 69, ProductionDate = 1589277616910};
Console.WriteLine(JsonSerializer.Serialize(car));
如果您不介意DateTimeOffset
而不是DateTime
,则始终存在DateTimeOffset.FromUnixTimeseconds
及其反向.ToNixTimeseconds