Typ wyliczeniowy nie działa już w obiekcie żądania FromBody .Net core 3.0

14

Niedawno zaktualizowałem mój interfejs WWW z .Net core 2.2 do .Net core 3.0 i zauważyłem, że moje żądania pojawiają się teraz, gdy przekazuję wyliczenie w poście do mojego punktu końcowego. Na przykład:

Mam następujący model mojego punktu końcowego interfejsu API:

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

Gdzie wygląda FeedbackType:

    public enum FeedbackType
    {
        Comment,
        Question
    }

A to jest metoda kontrolera:

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

        return Ok(response);
    }

Gdzie przesyłam to jako treść postu do kontrolera:

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

I otrzymuję teraz następujący komunikat o błędzie w tym punkcie końcowym:

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

Działało to w wersji 2.2, a błąd zaczął w wersji 3.0. Widziałem rozmowę o zmianie serializatora json w 3.0, ale nie jestem pewien, jak to powinno być obsługiwane.

Shawn
źródło

Odpowiedzi:

18

Framework nie używa już Json.Net domyślnie, a nowy wbudowany serializator ma własne problemy i krzywą uczenia się, aby uzyskać oczekiwane funkcje.

Jeśli chcesz przywrócić poprzednie domyślne użycie Newtonsoft.Json, musisz wykonać następujące czynności:

  1. Zainstaluj pakiet Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet.

  2. W ConfigureServices()dodać wywołanieAddNewtonsoftJson()

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

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

    //...
}
Nkosi
źródło
3
Chciałbym podkreślić, że oba kroki muszą zostać podjęte. Co jest dość oczywiste, ale jeśli zapomnisz pakiet Nuget i dodasz tylko „AddNewtonsoftJson ()”, wówczas twój kod kompiluje się i działa dobrze, podczas gdy nie działa.
Jean-Paul Smit,
17

Dla tych, którzy szukają krótkiego fragmentu

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });
}
Pashec
źródło
6

Obsługa szeregowania wyliczeń jako ciągów już istnieje, jeśli użyjesz wbudowanego JsonStringEnumConverter i przekażesz to do JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? widok = netcore-3.0

Oto przykładowy test, który go używa: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17

Yigit Tanriverdi
źródło
1
Dla tych, którzy nie wiedzą, jak przekazać JsonStringEnumConverter do JsonSerialzerOptions, oto kod:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang