Loại Enum không còn hoạt động trong đối tượng yêu cầu .Net core 3.0 FromBody


14

Gần đây tôi đã nâng cấp api web của mình từ .Net core 2.2 lên .Net core 3.0 và nhận thấy rằng các yêu cầu của tôi hiện đang bị lỗi khi tôi chuyển một enum trong một bài đăng đến điểm cuối của tôi. Ví dụ:

Tôi có mô hình sau cho điểm cuối api của mình:

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

Trường hợp FeedbackType trông như vậy:

    public enum FeedbackType
    {
        Comment,
        Question
    }

Và đây là phương thức điều khiển:

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

        return Ok(response);
    }

Nơi tôi gửi cái này làm thân bài cho bộ điều khiển:

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

Và tôi hiện đang nhận được lỗi sau khi đăng lên điểm cuối này:

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

Điều này đã làm việc trong 2.2 và bắt đầu lỗi trong 3.0. Tôi đã thấy nói về bộ nối tiếp json thay đổi trong 3.0, nhưng không chắc nên xử lý việc này như thế nào.

Câu trả lời:


18

framework không còn sử dụng Json.Net theo mặc định và serializer tích hợp mới có các vấn đề và đường cong học tập riêng để có được các tính năng mong đợi.

Nếu bạn muốn chuyển về mặc định sử dụng trước đó Newtonsoft.Json, thì bạn sẽ phải làm như sau:

  1. Cài đặt gói NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson .

  2. Trong ConfigureServices()thêm một cuộc gọi đếnAddNewtonsoftJson()

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

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

    //...
}

3
Tôi muốn chỉ ra cả hai bước phải được thực hiện. Điều này khá rõ ràng, nhưng nếu bạn quên gói Nuget và chỉ thêm "AddNewtonsoftJson ()" thì mã của bạn sẽ biên dịch và chạy tốt, trong khi nó không hoạt động.
Jean-Paul Smit

17

Đối với những người đang tìm kiếm một đoạn

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

6

Hỗ trợ tuần tự hóa enums như các chuỗi đã tồn tại nếu bạn sử dụng JsonStringEnumConverter tích hợp và chuyển nó vào JsonSerializerOptions: https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonstrisum ? xem = netcore-3.0

Đây là một thử nghiệm mẫu sử dụng nó: https://github.com/dotnet/corefx/blob/master/src/System.Text.Json/tests/Serialization/ReadScenarioTests.cs#L17


1
Đối với những người không biết cách chuyển JsonStringEnumConverter vào JsonSerialzerOptions, đây là mã:services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.IgnoreNullValues = true; });
Anthony Huang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.