我最近将Web API从.Net core 2.2升级到了.Net core 3.0,并注意到当我在端点中将枚举传递给端点时,我的请求现在出现错误。例如:
我的api端点具有以下模型:
public class SendFeedbackRequest
{
public FeedbackType Type { get; set; }
public string Message { get; set; }
}
其中的FeedbackType如下:
public enum FeedbackType
{
Comment,
Question
}
这是控制器方法:
[HttpPost]
public async Task<IActionResult> SendFeedbackAsync([FromBody]SendFeedbackRequest request)
{
var response = await _feedbackService.SendFeedbackAsync(request);
return Ok(response);
}
我将其作为帖子正文发送到控制器:
{
message: "Test"
type: "comment"
}
现在我在此端点上收到以下错误消息:
The JSON value could not be converted to MyApp.Feedback.Enums.FeedbackType. Path: $.type | LineNumber: 0 | BytePositionInLine: 13."
这在2.2中运行,并在3.0中启动了错误。我看到了有关3.0中更改json序列化程序的讨论,但不确定如何处理。
答案 0 :(得分:9)
默认情况下,framework不再使用Json.Net,并且新的内置序列化器具有其自身的问题和学习曲线,以获得所需的功能。
如果您想切换回以前使用Newtonsoft.Json
的默认设置,则必须执行以下操作:
安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet软件包。
在ConfigureServices()
中将通话添加到AddNewtonsoftJson()
public void ConfigureServices(IServiceCollection services) {
//...
services.AddControllers()
.AddNewtonsoftJson(); //<--
//...
}
答案 1 :(得分:5)
如果使用内置的JsonStringEnumConverter并将其传递到JsonSerializerOptions中,则已经支持将枚举序列化为字符串。 https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter?view=netcore-3.0
以下是使用它的样本测试: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17
答案 2 :(得分:4)
对于正在寻找摘要的人
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(opt =>
{
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}