.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
相关产品推荐
相关产品推荐

