枚举类型不再在.Net Core 3.0 FromBody请求对象中工作


14

我最近将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序列化程序的讨论,但不确定如何处理。

Answers:


18

默认情况下,该框架不再使用Json.Net,并且新的内置序列化器具有其自身的问题和学习曲线,以获得所需的功能。

如果您想切换回使用的先前默认设置Newtonsoft.Json,则必须执行以下操作:

  1. 安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet程序包。

  2. ConfigureServices()添加到AddNewtonsoftJson()

public void ConfigureServices(IServiceCollection services) {
    //...

    services.AddControllers()
        .AddNewtonsoftJson(); //<--

    //...
}

3
我想指出必须采取的两个步骤。这是很明显的,但是如果您忘记了Nuget包,而只添加“ AddNewtonsoftJson()”,则您的代码可以编译并运行良好,而它不能正常工作。
让-保罗·史密特

17

对于那些正在寻找片段的人

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });
}

6

如果您使用内置JsonStringEnumConverter并将其传递给JsonSerializerOptions,则已经支持将枚举序列化为字符串:https ://docs.microsoft.com/zh-cn/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


1
对于那些不知道如何将JsonStringEnumConverter传递给JsonSerialzerOptions的人,下面的代码是:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.