.NET 6 Web API中DateOnly/TimeOnly序列化报错400的解决求助
问题分析与解决方法
可能原因
- JSON序列化配置未正确生效:你在
Program.cs中配置的JSON选项可能没关联到API控制器的序列化逻辑,或者混淆了System.Text.Json与Newtonsoft.Json的配置方式。 - 自定义Converter逻辑存在缺陷:
DateOnlyJsonConverter/TimeOnlyJsonConverter的字符串解析逻辑不兼容你传入的JSON格式,导致无法完成转换。 - 请求JSON结构与模型不匹配:错误提示
request字段必填,说明接口参数是嵌套模型(比如包含Request属性的父类),但你的请求JSON未按该结构传递数据;或者字段大小写不匹配(C#属性是Tanggal,JSON传了Tanggal而非默认的tanggal)。
分步解决方法
1. 修正API序列化配置
确保Program.cs中的JSON配置正确绑定到控制器,且使用的序列化框架与Converter对应:
若使用System.Text.Json(.NET 6默认)
builder.Services.AddControllers() .AddJsonOptions(options => { // 添加自定义Converter options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter()); options.JsonSerializerOptions.Converters.Add(new TimeOnlyJsonConverter()); // 确保默认驼峰命名匹配JSON字段 options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; });
若使用Newtonsoft.Json(需先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包)
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.Converters.Add(new NewtonsoftDateOnlyConverter()); options.SerializerSettings.Converters.Add(new NewtonsoftTimeOnlyConverter()); options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
2. 修复自定义Converter的解析逻辑
以System.Text.Json的DateOnlyJsonConverter为例,确保能正确解析你传入的日期格式(比如yyyy-MM-dd):
public class DateOnlyJsonConverter : JsonConverter<DateOnly> { private const string DefaultFormat = "yyyy-MM-dd"; public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var dateStr = reader.GetString(); if (string.IsNullOrEmpty(dateStr)) throw new JsonException("日期字段不能为空"); if (!DateOnly.TryParseExact(dateStr, DefaultFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date)) throw new JsonException($"日期格式错误,需为{DefaultFormat}"); return date; } public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString(DefaultFormat, CultureInfo.InvariantCulture)); } }
3. 匹配请求JSON与模型结构
假设你的接口参数模型是如下结构:
public class AbsensiCheckInRequest { [Required] public Absensi Request { get; set; } } public class Absensi { [JsonConverter(typeof(DateOnlyJsonConverter))] public DateOnly Tanggal { get; set; } [JsonConverter(typeof(TimeOnlyJsonConverter))] public TimeOnly Waktu { get; set; } }
则请求JSON必须包含request嵌套字段,且字段名用驼峰格式:
{ "request": { "tanggal": "2024-05-20", "waktu": "09:30:00" } }
4. 验证特性与序列化框架的一致性
如果使用System.Text.Json,确保Absensi类上的特性是System.Text.Json.Serialization.JsonConverterAttribute;如果用Newtonsoft.Json,则使用Newtonsoft.Json.JsonConverterAttribute,避免跨框架混用导致特性失效。
内容的提问来源于stack exchange,提问作者S S
相关产品推荐
相关产品推荐

