DateOnly和TimeOnly类型不能序列化
参考文章:
将 .NET 6s 新的 DateOnly 序列化为 JSON
https://storck.io/posts/serializing-net-6-dateonly-to-json/
DateOnly和TimeOnly类型居然不能序列化!!! .Net 6下实现自定义JSON序列化
https://blog.csdn.net/sD7O95O/article/details/122388696
JsonSerializerOptions.IgnoreNullValues 属性
c# System.Text.Json 精讲
http://t.zoukankan.com/sogeisetsu-p-15618753.html
.Net 6引入了DateOnly和TimeOnly结构,可以存储日期和时间。
但在实际使用时,发现一个很尴尬的问题,DateOnly和TimeOnly居然不能被序列化:
那要这两类型还有何用!
解决方案
自定义转换器
为了解决这个问题,我们需要创建两个自定义转换器来处理这些类型
public class DateOnlyJsonConverter : JsonConverter<DateOnly> { private const string Format = "yyyy-MM-dd"; public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateOnly.ParseExact(reader.GetString()!, Format, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture)); } }
{ private const string Format = "HH:mm:ss:fff"; public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return TimeOnly.ParseExact(reader.GetString()!, Format, CultureInfo.InvariantCulture); } public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture)); } }
public class MyClass { [JsonConverter(typeof(DateOnlyJsonConverter))] public DateOnly DateOnly { get; set; } [JsonConverter(typeof(TimeOnlyJsonConverter))] public TimeOnly TimeOnly { get; set; } }
使用属性自定义 JsonConvertor
System.Text.Json.Serialization.JsonConverter幸运的是,通过在模型中应用属性,我们可以轻松地为 DateOnly 字段定义自定义序列化:
替代方案:注册一个全局转换器
除了使用属性在字段级别注册转换器,还可以全局注册自定义 DateOnly 转换器以使其适用于所有控制器。这是使用IMvcBuilder.AddJsonOptions 添加到AddControllersin 中完成的Program.cs,如下所示:
services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter()); });