.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,避免重复配置:
- 在控制器构造函数注入
IOptions<JsonOptions>:
private readonly JsonOptions _mvcJsonOptions; public YourController(IOptions<JsonOptions> mvcJsonOptions) { _mvcJsonOptions = mvcJsonOptions.Value; }
- 在方法中复用配置(建议克隆实例,避免修改全局配置):
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
相关产品推荐
相关产品推荐

