我正在将使用 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 获得相同的行为,而不需要对源代码添加侵入性更改?