O tipo de enum não está mais funcionando no objeto de solicitação .Body core 3.0 FromBody

14

Recentemente, atualizei minha API da Web do .Net core 2.2 para o .Net core 3.0 e notei que minhas solicitações estão recebendo um erro agora quando passo uma enumeração em uma postagem para o endpoint. Por exemplo:

Eu tenho o seguinte modelo para o meu ponto de extremidade da API:

    public class SendFeedbackRequest
    {
        public FeedbackType Type { get; set; }
        public string Message { get; set; }
    }

Onde o FeedbackType se parece com isso:

    public enum FeedbackType
    {
        Comment,
        Question
    }

E este é o método do controlador:

    [HttpPost]
    public async Task<IActionResult> SendFeedbackAsync([FromBody]SendFeedbackRequest request)
    {
        var response = await _feedbackService.SendFeedbackAsync(request);

        return Ok(response);
    }

Onde eu envio isso como o corpo da postagem para o controlador:

{
    message: "Test"
    type: "comment"
}

E agora estou recebendo o seguinte erro ao postar neste endpoint:

The JSON value could not be converted to MyApp.Feedback.Enums.FeedbackType. Path: $.type | LineNumber: 0 | BytePositionInLine: 13."

Isso estava funcionando no 2.2 e iniciou o erro no 3.0. Eu vi falar sobre o serializador json mudando no 3.0, mas não sei como isso deve ser tratado.

Shawn
fonte

Respostas:

18

A estrutura não usa mais o Json.Net por padrão e o novo serializador interno tem seus próprios problemas e curva de aprendizado para obter os recursos esperados.

Se você deseja voltar ao padrão anterior de uso Newtonsoft.Json, faça o seguinte:

  1. Instale o pacote Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet.

  2. Em ConfigureServices()adicionar uma chamada paraAddNewtonsoftJson()

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

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

    //...
}
Nkosi
fonte
3
Eu gostaria de salientar que os dois passos precisam ser dados. O que é bastante óbvio, mas se você esquecer o pacote Nuget e adicionar apenas "AddNewtonsoftJson ()", seu código será compilado e executado muito bem, embora não funcione.
Jean-Paul Smit
17

Para quem procura um snippet

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

Já existe suporte para serialização de enumerações como seqüências de caracteres se você usar o JsonStringEnumConverter interno e o passar para o JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? view = netcore-3.0

Aqui está um exemplo de teste que o utiliza: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17

Yigit Tanriverdi
fonte
11
Para aqueles que não sabem como passar o JsonStringEnumConverter para o JsonSerialzerOptions, aqui está o código:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang