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 属性

https://docs.microsoft.com/zh-cn/dotnet/api/system.text.json.jsonserializeroptions.ignorenullvalues?view=net-6.0

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());
    });

 

posted @ 2022-10-26 15:30  刘小吉  阅读(172)  评论(0编辑  收藏  举报