You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

前端打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:05:07