최근에 웹 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가 변경되는 것에 대해 이야기했지만 이것이 어떻게 처리되어야하는지 잘 모르겠습니다.
답변
프레임 워크는 더 이상 기본적으로 Json.Net을 사용하지 않으며 새로운 내장 시리얼 라이저에는 고유 한 문제와 학습 곡선이있어 예상되는 기능을 얻습니다.
을 사용하여 이전 기본값으로 다시 전환 Newtonsoft.Json
하려면 다음을 수행해야합니다.
-
Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 패키지를 설치하십시오 .
-
에서은
ConfigureServices()
에 대한 호출을 추가AddNewtonsoftJson()
public void ConfigureServices(IServiceCollection services) {
//...
services.AddControllers()
.AddNewtonsoftJson(); //<--
//...
}
답변
스 니펫을 찾는 사람들을 위해
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers().AddJsonOptions(opt =>
{
opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
}
답변
당신이 사용하는 경우 문자열로 열거를 직렬화에 대한 지원은 이미 존재하는 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