前端打印byte[]类型日期出错,求修复自定义JsonConverter无效问题
问题分析
你当前的ByteJsonConverter仅实现了byte[]与Base64字符串的互转,前端拿到的是无意义的Base64编码而非可识别的日期格式,这就是方案无效的核心原因。要解决问题,需要针对**存储日期的byte[]**做专门的转换,将其转为前端能解析的日期字符串。
解决方案
根据byte[]存储日期的不同方式,提供以下几种针对性的转换器实现:
场景1:byte[]是通过BinaryFormatter序列化DateTime得到的
如果后端的AttemptDate是将DateTime通过BinaryFormatter序列化为byte[]存储的,可使用以下转换器:
public class ByteToDateTimeConverter : JsonConverter<byte[]> { public override byte[] ReadJson(JsonReader reader, Type objectType, byte[] existingValue, bool hasExistingValue, JsonSerializer serializer) { // 将前端传入的日期字符串转为DateTime,再序列化为byte[] if (reader.Value is string dateStr && DateTime.TryParse(dateStr, out DateTime dateTime)) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, dateTime); return ms.ToArray(); } } throw new JsonSerializationException("无法解析传入的日期字符串"); } public override void WriteJson(JsonWriter writer, byte[] value, JsonSerializer serializer) { // 将byte[]反序列化为DateTime,再转为前端易识别的ISO 8601格式字符串 using (var ms = new MemoryStream(value)) { var formatter = new BinaryFormatter(); var dateTime = (DateTime)formatter.Deserialize(ms); writer.WriteValue(dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")); } } }
场景2:byte[]是DateTime.Ticks的字节数组
如果byte[]存储的是DateTime.Ticks(长整型)的字节形式,可使用以下转换器:
public class ByteTicksToDateTimeConverter : JsonConverter<byte[]> { public override byte[] ReadJson(JsonReader reader, Type objectType, byte[] existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.Value is string dateStr && DateTime.TryParse(dateStr, out DateTime dateTime)) { long ticks = dateTime.Ticks; return BitConverter.GetBytes(ticks); } throw new JsonSerializationException("无法解析传入的日期字符串"); } public override void WriteJson(JsonWriter writer, byte[] value, JsonSerializer serializer) { long ticks = BitConverter.ToInt64(value, 0); DateTime dateTime = new DateTime(ticks); writer.WriteValue(dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")); } }
场景3:byte[]是UTF8编码的日期字符串
如果byte[]本身就是UTF8编码的日期文本,直接转字符串即可:
public class ByteUtf8ToDateStringConverter : JsonConverter<byte[]> { public override byte[] ReadJson(JsonReader reader, Type objectType, byte[] existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.Value is string dateStr) { return Encoding.UTF8.GetBytes(dateStr); } throw new JsonSerializationException("无法解析传入的日期字符串"); } public override void WriteJson(JsonWriter writer, byte[] value, JsonSerializer serializer) { string dateStr = Encoding.UTF8.GetString(value); writer.WriteValue(dateStr); } }
使用方式
将属性上的转换器标记替换为对应场景的转换器即可:
// 以场景1为例,替换为你需要的转换器类型 [JsonConverter(typeof(ByteToDateTimeConverter))] public byte[]? AttemptDate { get; set; }
内容的提问来源于stack exchange,提问作者Rafael Monteiro
相关产品推荐
相关产品推荐

