从 Newtonsoft 迁移到 System.Text 时如何保持相同的 DataAnnotations 行为

问题描述 投票:0回答:1

我正在将使用 Newtonsoft.Json 的 webapi (.NET 8) 迁移到 System.Text.Json。一切都很顺利,直到我偶然发现了与“required”关键字相关的一些差异。

我将尝试使用 WeatherForecast 默认 .NET 示例来展示它:

程序.cs

 // code omitted for brevity
 builder.Services.AddControllers();
 // code omitted for brevity

WeatherForecast.cs

public class WeatherForecast
{
    public DateOnly Date { get; set; }

    public int TemperatureC { get; set; }

    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

    [Required]
    public required string Summary { get; set; }
}

WeatherForecastController.cs

// code omitted for brevity
[HttpPost(Name = "WeatherForecast")]
public IActionResult Post(WeatherForecast request)
{
    return Ok(request);
}

如果我调用 Post 端点而不在正文中传递 Summary 属性,请使用 swagger,如下所示:

{
  "date": "2024-01-01",
  "temperatureC": 1,
}

我收到 400 和以下错误消息:

"errors": {
    "$": [
      "JSON deserialization for type 'NewtonsoftVsSystemTextLab.WeatherForecast' was missing required properties, including the following: summary"
    ],
    "request": [
      "The request field is required."
    ]
  },

另一方面,如果我使用 Newtonsoft,只需将此扩展方法添加到 Program.cs 中的这一行即可:

builder.Services.AddControllers().AddNewtonsoftJson();

我从 DataAnnotations 收到用户友好的错误消息:

"errors": {
    "Summary": [
      "The Summary field is required."
    ]
  },

有没有一种方法可以使用 System.Text.Json 获得相同的行为,而不需要对源代码添加侵入性更改?

c# json.net asp.net-core-webapi system.text.json
1个回答
0
投票

尝试改变:

   [Required]
    public required string Summary { get; set; }

进入:

    [Required]
    public string Summary { get; set; }

结果:

© www.soinside.com 2019 - 2024. All rights reserved.