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

.NET 6 Web Service中System.DateOnly序列化反序列化异常修复求助

问题解决方案

问题根源

你在Startup中配置的DateOnlyJsonConverter是给ASP.NET Core MVC的内置序列化/反序列化机制(比如自动模型绑定)用的,但当前控制器方法是手动调用JsonSerializer.Deserialize,且创建了全新的JsonSerializerOptions实例——这个实例里并没有包含你注册的DateOnlyJsonConverter,所以反序列化DateOnly类型时抛出异常。


具体解决办法

办法1:手动给自定义JsonSerializerOptions添加转换器

直接在你创建的JsonSerializerOptions里加入DateOnlyJsonConverter,确保反序列化时能识别DateOnly类型:

public async Task<IActionResult> PutDirectorStr(string jsonstr, CancellationToken cancellationToken)
{
    Director? director = new Director();
    try
    {
        var options = new JsonSerializerOptions
        {
            IncludeFields = true,
            PropertyNameCaseInsensitive = true
        };
        // 手动添加DateOnly转换器
        options.Converters.Add(new DateOnlyJsonConverter());

        director = JsonSerializer.Deserialize<Director>(jsonstr, options);
        var sr = await _directorService.PutDirector(director, cancellationToken);
        if (sr.StatusCode < 0) { return BadRequest(sr.StatusText); }
        
        // 记得返回合适的响应,比如Ok()
        return Ok();
    }
    catch (Exception ex)
    {
        // 按需添加异常处理
        return StatusCode(500, ex.Message);
    }
}

办法2:复用MVC已配置的JsonSerializerOptions

从依赖注入容器中获取全局配置好的JsonOptions,避免重复配置:

  1. 在控制器构造函数注入IOptions<JsonOptions>:
private readonly JsonOptions _mvcJsonOptions;

public YourController(IOptions<JsonOptions> mvcJsonOptions)
{
    _mvcJsonOptions = mvcJsonOptions.Value;
}
  1. 在方法中复用配置(建议克隆实例,避免修改全局配置):
var options = new JsonSerializerOptions(_mvcJsonOptions.JsonSerializerOptions)
{
    IncludeFields = true,
    PropertyNameCaseInsensitive = true
};
director = JsonSerializer.Deserialize<Director>(jsonstr, options);

办法3:改用MVC自动模型绑定(推荐)

没必要手动接收字符串再反序列化,直接让MVC自动绑定到Director对象,会自动使用你在Startup中注册的转换器:

public async Task<IActionResult> PutDirector([FromBody] Director director, CancellationToken cancellationToken)
{
    try
    {
        var sr = await _directorService.PutDirector(director, cancellationToken);
        if (sr.StatusCode < 0) 
        { 
            return BadRequest(sr.StatusText); 
        }
        return Ok();
    }
    catch (Exception ex)
    {
        return StatusCode(500, ex.Message);
    }
}

额外检查:确保DateOnlyJsonConverter实现正确

如果以上方法仍无效,检查你的转换器是否正确实现了JsonConverter<DateOnly>,示例实现如下:

public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string DefaultDateFormat = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var dateStr = reader.GetString();
        return DateOnly.ParseExact(dateStr!, DefaultDateFormat, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(DefaultDateFormat, CultureInfo.InvariantCulture));
    }
}

内容的提问来源于stack exchange,提问作者ZedZip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:34:52