Тип Enum більше не працює в .Net core 3.0 FromBody об’єкт запиту


14

Нещодавно я оновив свою веб-версію api з .Net core 2.2 до .Net core 3.0 і помітив, що мої запити отримують помилку зараз, коли я передаю enum у дописі до моєї кінцевої точки. Наприклад:

У мене є кінцева точка api:

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

Де виглядає такий тип зворотного зв’язку:

    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. Я бачив розмови про те, що серіалізатор json змінюється в 3.0, але не впевнений, як з цим слід поводитися.

Відповіді:


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/en-us/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; });
Ентоні Хуан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.