.Net core 3.0 FromBody 요청 개체에서 열거 형 유형이 더 이상 작동하지 않음


14

최근에 웹 API를 .Net 코어 2.2에서 .Net 코어 3.0으로 업그레이드했으며 게시물의 열거 형을 엔드 포인트로 전달하면 요청에 오류가 있음을 알았습니다. 예를 들면 다음과 같습니다.

내 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에서 오류를 시작했습니다. 3.0에서 json serializer가 변경되는 것에 대해 이야기했지만 이것이 어떻게 처리되어야하는지 잘 모르겠습니다.

답변:


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 ()"만 추가하면 코드가 컴파일되고 제대로 작동하지만 작동하지 않습니다.
Jean-Paul 님이

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; });
Anthony Huang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.