El tipo de enumeración ya no funciona en .Net core 3.0 Objeto de solicitud FromBody

15

Recientemente actualicé mi API web de .Net core 2.2 a .Net core 3.0 y noté que mis solicitudes están recibiendo un error ahora cuando paso una enumeración en una publicación a mi punto final. Por ejemplo:

Tengo el siguiente modelo para mi punto final de la API:

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

Donde el FeedbackType se ve así:

    public enum FeedbackType
    {
        Comment,
        Question
    }

Y este es el método del controlador:

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

        return Ok(response);
    }

Donde envío esto como el cuerpo de la publicación al controlador:

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

Y ahora recibo el siguiente error al publicar en este punto final:

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

Esto funcionaba en 2.2 y comenzó el error en 3.0. Vi hablar sobre el serializador json cambiando en 3.0, pero no estoy seguro de cómo se debe manejar esto.

Shawn
fuente

Respuestas:

18

framework ya no usa Json.Net de manera predeterminada y el nuevo serializador incorporado tiene sus propios problemas y curva de aprendizaje para obtener las características esperadas.

Si desea volver al valor predeterminado anterior de uso Newtonsoft.Json, deberá hacer lo siguiente:

  1. Instale el paquete Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet.

  2. En ConfigureServices()agregar una llamada aAddNewtonsoftJson()

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

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

    //...
}
Nkosi
fuente
3
Me gustaría señalar que se deben tomar ambos pasos. Lo cual es bastante obvio, pero si olvida el paquete Nuget y solo agrega "AddNewtonsoftJson ()", entonces su código se compila y funciona bien, mientras no funciona.
Jean-Paul Smit
18

Para aquellos que buscan un fragmento

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });
}
Pashec
fuente
Debería ser StringEnumConverter, no JsonStringEnumConverter.
villecoder hace
6

La compatibilidad para serializar enumeraciones como cadenas ya existe si usa el JsonStringEnumConverter incorporado y lo pasa a JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? view = netcore-3.0

Aquí hay una prueba de muestra que lo usa: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17

Yigit Tanriverdi
fuente
1
Para aquellos que no saben cómo pasar JsonStringEnumConverter a JsonSerialzerOptions, aquí está el código:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang