Тип enum больше не работает в .Net core 3.0 объект запроса FromBody

15

Я недавно обновил свой веб-API с .Net core 2.2 до .Net core 3.0 и заметил, что мои запросы теперь получают ошибку, когда я передаю enum в сообщении моей конечной точке. Например:

У меня есть следующая модель для моей конечной точки API:

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

Где FeedbackType выглядит так:

    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

Framework больше не использует Json.Net по умолчанию, а новый встроенный сериализатор имеет свои проблемы и кривую обучения для получения ожидаемых функций.

Если вы хотите вернуться к предыдущему использованию по умолчанию Newtonsoft.Json, вам нужно будет сделать следующее:

  1. Установите пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet.

  2. В ConfigureServices()добавить вызовAddNewtonsoftJson()

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

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

    //...
}
Nkosi
источник
3
Я хотел бы отметить, что оба шага должны быть сделаны. Что совершенно очевидно, но если вы забудете пакет Nuget и добавите только AddNewtonsoftJson (), тогда ваш код компилируется и работает просто отлично, хотя он не работает.
Жан-Поль Смит
18

Для тех, кто ищет фрагмент

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddJsonOptions(opt =>
    {
        opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
    });
}
Pashec
источник
Должно быть StringEnumConverter, нет JsonStringEnumConverter.
villecoder
6

Поддержка сериализации перечислений в виде строк уже существует, если вы используете встроенный JsonStringEnumConverter и передаете его в JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? вид = 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; });
Энтони Хуан