You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6 Web API中DateOnly/TimeOnly序列化报错400的解决求助

问题分析与解决方法

可能原因

  1. JSON序列化配置未正确生效:你在Program.cs中配置的JSON选项可能没关联到API控制器的序列化逻辑,或者混淆了System.Text.Json与Newtonsoft.Json的配置方式。
  2. 自定义Converter逻辑存在缺陷:DateOnlyJsonConverter/TimeOnlyJsonConverter的字符串解析逻辑不兼容你传入的JSON格式,导致无法完成转换。
  3. 请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:20:28