Jenis Enum tidak lagi berfungsi di objek permintaan .Body core 3.0 FromBody

14

Saya baru-baru ini memutakhirkan api web saya dari .Net core 2.2 menjadi .Net core 3.0 dan memperhatikan bahwa permintaan saya mendapatkan kesalahan sekarang ketika saya meneruskan enum dalam sebuah pos ke titik akhir saya. Sebagai contoh:

Saya memiliki model berikut untuk titik api saya:

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

Di mana FeedbackType terlihat seperti ini:

    public enum FeedbackType
    {
        Comment,
        Question
    }

Dan ini adalah metode pengontrol:

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

        return Ok(response);
    }

Di mana saya mengirim ini sebagai postingan ke controller:

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

Dan saya sekarang mendapatkan kesalahan saat memposting ke titik akhir ini:

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

Ini berfungsi di 2.2 dan memulai kesalahan di 3.0. Saya melihat pembicaraan tentang serializer json berubah pada 3.0, tetapi tidak yakin bagaimana ini harus ditangani.

Shawn
sumber

Jawaban:

18

framework tidak lagi menggunakan Json.Net secara default dan serializer built-in yang baru memiliki masalah dan kurva belajar sendiri untuk mendapatkan fitur yang diharapkan.

Jika Anda ingin beralih kembali ke standar penggunaan sebelumnya Newtonsoft.Json, maka Anda harus melakukan yang berikut:

  1. Instal paket NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson .

  2. Di ConfigureServices()tambahkan panggilan keAddNewtonsoftJson()

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

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

    //...
}
Nkosi
sumber
3
Saya ingin menunjukkan kedua langkah harus diambil. Yang cukup jelas, tetapi jika Anda lupa paket Nuget dan hanya menambahkan "AddNewtonsoftJson ()" maka kode Anda mengkompilasi dan berjalan dengan baik, sementara itu tidak berfungsi.
Jean-Paul Smit
17

Bagi mereka yang mencari cuplikan

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

Dukungan untuk membuat serial enum sebagai string sudah ada jika Anda menggunakan JsonStringEnumConverter bawaan dan meneruskannya ke JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstringenumconverter ? view = netcore-3.0

Berikut ini adalah contoh pengujian yang menggunakannya: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17

Yigit Tanriverdi
sumber
1
Bagi mereka yang tidak tahu bagaimana meneruskan JsonStringEnumConverter ke JsonSerialzerOptions, berikut adalah kodenya:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang