.NET Core 3.0 웹 API에서 역 직렬화되지 않은 사용자 정의 구조체의 속성 (.NET Core 2.2에서 작동)

네오

다음 컨트롤러를 사용하여 .NET Core 3.0을 대상으로하는 ASP.NET Core 웹 API 프로젝트가 있습니다.

public class FooController : ControllerBase
{
    [HttpPost]
    public ActionResult Post(Foo foo) => Ok()
}

Foo 별도의 라이브러리에 다음과 같이 정의됩니다.

public struct Foo
{
    public int Bar { get; }

    public Foo(int bar) => Bar = bar;
}

다음을 사용하여 콘솔 앱에서 API를 호출합니다.

new HttpClient().PostAsJsonAsync("http://localhost:55555/api/foo", new Foo(1)).Wait();

컨트롤러 방법을 입력 foo.Bar하면 기본값은 0입니다. 1이 될 것으로 예상합니다.

이것은 .NET Core 2.2에서 예상대로 작동했습니다. JSON deserializer는 속성 이름과 일치하는 매개 변수 이름 (대 / 소문자 구분 안 함)이있는 오버로드 된 생성자를 통해 구조체의 전용 setter가있는 속성을 처리합니다.

기본 구조체와 .NET 코어 3.0이 더 이상 작동하지 않습니다 ( 편집 : 때문 아니라 마틴 울리히 지적 ). 그러나와 같은 표준 구조체 유형을 사용하면 DateTime제대로 작동합니다. DateTime예를 들어 이미 지원 하는 내 구조체에 추가로 수행해야 할 작업이 있습니까? 이미 아래 코드로 구현 ISerializable시도했지만 Foo작동하지 않았습니다.

public Foo(SerializationInfo info, StreamingContext context)
{
    Bar = (int)info.GetValue("bar", typeof(int));
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
    info.AddValue("bar", Bar, typeof(int));
}

어떤 도움이라도 대단히 감사하겠습니다.

마틴 울리히

새로운 System.Text.Json API는 읽기 전용 속성의 역 직렬화를 포함하여 Newtonsoft.Json ( "Json.NET")이 수행하는 모든 기능을 지원하지 않습니다 .

이 기능이 필요한 경우 ASP.NET Core 2.2에서 3.0으로 마이그레이션 가이드에 설명 된대로 Newtonsoft.Json을 사용하도록 전환합니다 .

services.AddMvc()
    .AddNewtonsoftJson();

또는

services.AddControllers()
    .AddNewtonsoftJson();

DateTimeSystem.Text.Json3.0 스택에서 이미 알려져 있으며 이에 대한 JsonConverter<T>구현 JsonConverterDateTime있습니다..

사용자 지정 변환기를 만들고 ASP.NET Core에 등록하려면 https://stackoverflow.com/a/57334833/784387을 참조 하세요.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관