如何使用Refit序列化DateOnly?日期范围筛选选DateOnly还是DateTime?
日期范围筛选:DateOnly vs DateTime选择及序列化问题解决
一、DateOnly是无时间日期筛选的最优选择
DateOnly完全适配无需处理时间的日期场景,比DateTime更合适:
- 语义明确:专门为仅日期场景设计,代码可读性更高,不会让其他开发者困惑是否需要处理时间部分。
- 避免边界错误:DateTime默认带00:00:00时间戳,用它做结束日期筛选时,容易漏掉当天非凌晨的数据;DateOnly则直接代表完整的一天,不会出现这类歧义。
二、解决DateOnly的序列化问题(适配System.Text.Json与Refit)
1. 为System.Text.Json添加DateOnly自定义转换器
由于默认的System.Text.Json不支持DateOnly序列化,需要实现自定义转换器:
public class DateOnlyJsonConverter : JsonConverter<DateOnly> { private const string DefaultDateFormat = "yyyy-MM-dd"; public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return DateOnly.ParseExact(reader.GetString()!, DefaultDateFormat); } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(DefaultDateFormat)); } }
注册转换器到Json序列化配置:
var jsonOptions = new JsonSerializerOptions(); jsonOptions.Converters.Add(new DateOnlyJsonConverter());
2. 在Refit中配置自定义序列化选项
将上面的Json配置传入Refit的设置,让Refit使用带DateOnly支持的序列化器:
var refitSettings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(jsonOptions) }; // 初始化Refit API客户端 var apiClient = RestService.For<IMyApiInterface>("https://your-api-base-url", refitSettings);
内容的提问来源于stack exchange,提问作者Rupesh Plant
相关产品推荐
相关产品推荐

