Il tipo Enum non funziona più in .Net core 3.0 Oggetto richiesta FromBody


14

Di recente ho aggiornato il mio API Web da .Net core 2.2 a .Net core 3.0 e ho notato che le mie richieste stanno ricevendo un errore ora quando passo un enum in un post al mio endpoint. Per esempio:

Ho il seguente modello per il mio endpoint api:

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

Dove si presenta così FeedbackType:

    public enum FeedbackType
    {
        Comment,
        Question
    }

E questo è il metodo del controller:

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

        return Ok(response);
    }

Dove lo invio come post body al controller:

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

E ora sto ricevendo il seguente errore posting su questo endpoint:

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

Funzionava in 2.2 e ha iniziato l'errore in 3.0. Ho visto parlare del serializzatore json che cambia in 3.0, ma non sono sicuro di come gestirlo.

Risposte:


18

framework non utilizza più Json.Net per impostazione predefinita e il nuovo serializzatore integrato ha i propri problemi e la curva di apprendimento per ottenere le funzionalità previste.

Se desideri tornare al precedente utilizzo predefinito Newtonsoft.Json, dovrai effettuare le seguenti operazioni:

  1. Installa il pacchetto NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson .

  2. In ConfigureServices()aggiungi una chiamata aAddNewtonsoftJson()

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

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

    //...
}

3
Vorrei sottolineare che entrambi i passaggi devono essere presi. Il che è abbastanza ovvio, ma se si dimentica il pacchetto Nuget e si aggiunge solo "AddNewtonsoftJson ()", il codice viene compilato ed eseguito correttamente, mentre non funziona.
Jean-Paul Smit,

17

Per chi è alla ricerca di uno snippet

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

Dovrebbe essere StringEnumConverter, no JsonStringEnumConverter.
villecoder

6

Il supporto per la serializzazione di enumerazioni come stringhe esiste già se si utilizza JsonStringEnumConverter integrato e lo si passa a JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? view = netcore-3.0

Ecco un test di esempio che lo utilizza: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17


1
Per coloro che non sanno come passare JsonStringEnumConverter in JsonSerialzerOptions, ecco il codice:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.