.NET 8 Web API中JSON无法转换为System.DateOnly的问题
.NET 8 Web API DateOnly JSON转换400错误解决办法
方法一:改用标准ISO 8601日期格式
默认情况下,.NET 8的System.Text.Json只识别两位数月份和日期的yyyy-MM-dd格式。你当前请求里的"2024-1-7"是单数位月日,不符合默认解析规则,改成"2024-01-07"就能正常解析:
{ ... "createDate":"2024-01-07" ... }
方法二:配置全局支持多日期格式
如果需要兼容单数位月日的格式,在Program.cs里配置Json序列化选项,添加自定义日期格式:
builder.Services.AddControllers() .AddJsonOptions(options => { var dateConverter = new DateOnlyConverter(); dateConverter.SupportedFormats = new[] { "yyyy-MM-dd", "yyyy-M-d" }; options.JsonSerializerOptions.Converters.Add(dateConverter); });
注:.NET 8自带DateOnlyConverter,无需手动实现基础转换器
方法三:自定义日期转换器(复杂场景)
如果需要支持更多特殊格式,比如MM/dd/yyyy,可以自己实现JsonConverter<DateOnly>:
public class CustomDateOnlyConverter : JsonConverter<DateOnly> { private readonly string[] _formats = { "yyyy-MM-dd", "yyyy-M-d", "MM/dd/yyyy" }; public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (DateOnly.TryParseExact(reader.GetString(), _formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) { return date; } throw new JsonException("无法将值转换为DateOnly"); } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("yyyy-MM-dd")); } }
然后在Program.cs注册转换器,或者直接给CreateDate属性加特性:
public class CreateItemRequest { ... [JsonConverter(typeof(CustomDateOnlyConverter))] public DateOnly CreateDate { get; set; } ... }
内容的提问来源于stack exchange,提问作者user3953989
相关产品推荐
相关产品推荐

