ประเภท 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; }
    }

ตำแหน่ง 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 serializer ที่เปลี่ยนแปลงใน 3.0 แต่ไม่แน่ใจว่าควรจัดการอย่างไร

คำตอบ:


18

เฟรมเวิร์กไม่ได้ใช้ Json.Net อีกต่อไปตามค่าเริ่มต้นและ serializer ในตัวใหม่มีปัญหาของตัวเองและเส้นโค้งการเรียนรู้เพื่อรับคุณลักษณะที่คาดหวัง

หากคุณต้องการเปลี่ยนกลับไปใช้ค่าเริ่มต้นก่อนหน้านี้Newtonsoft.Jsonคุณต้องทำสิ่งต่อไปนี้:

  1. ติดตั้งแพคเกจMicrosoft.AspNetCore.Mvc.NewtonsoftJson NuGet

  2. ในการConfigureServices()เพิ่มสายให้AddNewtonsoftJson()

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

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

    //...
}

3
ฉันต้องการชี้ให้เห็นว่าต้องดำเนินการทั้งสองขั้นตอน ซึ่งค่อนข้างชัดเจน แต่ถ้าคุณลืมแพ็คเกจ Nuget และเพียงเพิ่ม "AddNewtonsoftJson ()" ดังนั้นรหัสของคุณจะคอมไพล์และทำงานได้ดีในขณะที่มันไม่ทำงาน
Jean-Paul Smit

17

สำหรับผู้ที่กำลังมองหาตัวอย่าง

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

6

การสนับสนุนสำหรับการจัดลำดับ enums เป็นสตริงมีอยู่แล้วหากคุณใช้ 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; });
Anthony Huang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.