Asp.net core 将ASP.NET Core 2.2移植到3.0后,请求DateTime未正确反序列化并引发错误

Asp.net core 将ASP.NET Core 2.2移植到3.0后,请求DateTime未正确反序列化并引发错误,asp.net-core,asp.net-web-api,.net-core,Asp.net Core,Asp.net Web Api,.net Core,我正在将一个简单的web API从asp.net core 2.2移植到asp.net core 3.0,并在向操作发送请求后出现序列化错误 无法将JSON值转换为System.DateTime。路径:$.DateOfBirth |行号:6 | BytePositionLine:28 数据契约(request)没有任何变化:我已经将request DTO从一个解决方案复制到另一个解决方案,并且DTO上存在相同的数据注释,如下所示 [Required] public Dat

我正在将一个简单的web API从asp.net core 2.2移植到asp.net core 3.0,并在向操作发送请求后出现序列化错误

无法将JSON值转换为System.DateTime。路径:$.DateOfBirth |行号:6 | BytePositionLine:28

数据契约(request)没有任何变化:我已经将request DTO从一个解决方案复制到另一个解决方案,并且DTO上存在相同的数据注释,如下所示

        [Required]
    public DateTime DateOfBirth { get; set; }
这是请求json字段

    "DateOfBirth": "01/01/1980",
为什么asp.net core 2.2能够正确地反序列化,而asp.net core 3.0不能? 有什么见解吗

对于新的asp.net core 3.0项目,我使用

    <PackageReference Include="System.ComponentModel.Annotations" Version="4.6.0" />
我不再得到错误。但是,我无法更改从客户机发送的json字段值,因为我有许多依赖于web api的客户机应用程序,协调这些更改将是一个漫长的过程。所以我需要保持合同不变

我从中找到了以下文本

尝试反序列化不符合配置文件的表示将导致JsonSerializer抛出JsonException:


我需要解决这个问题,因为我无法更改客户端应用程序发送的内容

这将在短期内解决问题

            services.AddControllers().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
        });

公共类DateTimeConverter:JsonConverter
{
公共覆盖日期时间读取(参考Utf8JsonReader reader,键入typeToConvert,JsonSerializerOptions选项)
{
Assert(typeToConvert==typeof(DateTime));
return DateTime.Parse(reader.GetString());
}
公共重写无效写入(Utf8JsonWriter编写器、日期时间值、JsonSerializerOptions选项)
{
writer.WriteStringValue(value.ToUniversalTime().ToString(“yyyy'-'MM'-'dd'T'HH':'MM':'ssZ”);
}
}

应该澄清一下。@KirkLarkin,你能说得更具体一点吗?我链接的文档解释了2.2和3.0在JSON处理方式上的区别。它以前是JSON.NET,但现在是
System.Text.JSON
类型。您可以在3.0中切换回JSON.NET,也可以自己回答这一部分
            services.AddControllers().AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
        });
    public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}