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

.NET反序列化DateOnly类型报错,是否存在内置DateOnlyConverter?

解答

版本差异说明

  • 若使用 .NET 7 及以上版本:System.Text.Json 已原生支持DateOnly、TimeOnly类型的序列化与反序列化,不会触发该报错,也不需要额外引入转换器。
  • 若使用 .NET 6 及以下版本:官方类库中没有内置可直接使用的DateOnlyConverter,你找不到该类型是正常情况,需要自行实现自定义转换器。

你在资料中看到的DateOnlyConverter,要么是高版本.NET的内置实现,要么是开发者自行封装的社区实现,低版本框架默认类库中确实不存在。


自定义转换器实现方案

1. 针对 System.Text.Json 的实现

using System.Text.Json;
using System.Text.Json.Serialization;

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    // 可根据业务需要调整日期格式
    private const string SerializationFormat = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dateStr = reader.GetString();
        return DateOnly.ParseExact(dateStr!, SerializationFormat);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(SerializationFormat));
    }
}

使用方式二选一即可:

  • 单属性生效:在实体的DateOnly类型属性上添加[JsonConverter(typeof(DateOnlyJsonConverter))]特性
  • 全局生效:初始化JsonSerializerOptions时注册转换器,所有序列化/反序列化操作自动生效:
var jsonOptions = new JsonSerializerOptions();
jsonOptions.Converters.Add(new DateOnlyJsonConverter());
// 反序列化时传入配置即可
var entry = JsonSerializer.Deserialize<MementoTimeEntry>(jsonContent, jsonOptions);

如果你的实体中TimeOnly类型也抛出同类不支持的错误,按照相同逻辑实现TimeOnly的转换器即可,仅需替换对应类型和时间格式化字符串(比如HH:mm:ss)。


2. 针对 Newtonsoft.Json (Json.NET) 的实现

如果你项目用的是Newtonsoft.Json做序列化,可以用如下实现:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public class DateOnlyJsonConverter : IsoDateTimeConverter
{
    public DateOnlyJsonConverter()
    {
        DateTimeFormat = "yyyy-MM-dd";
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var baseResult = base.ReadJson(reader, typeof(DateTime), existingValue, serializer);
        return baseResult is DateTime time ? DateOnly.FromDateTime(time) : default;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (value is DateOnly date)
        {
            base.WriteJson(writer, date.ToDateTime(TimeOnly.MinValue), serializer);
        }
    }
}

使用逻辑和System.Text.Json版本一致,支持单属性标注或全局注册。


内容的提问来源于stack exchange,提问作者ScottishTapWater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:48:25