2014-02-06 2 views
3

스프링 웹 MVC/Spring Hateoas 위에 API를 작성 중이며 간단한 클래스 계층 구조의 비 직렬화가 매력처럼 작동한다고해도 jackson을 사용하여 Json 입력을 deserialize 할 수는 없습니다. 모두가 SO에 다른 많은 유사한 질문에 나를 보낸다잭슨의 상속과 역 직렬화

public class A { 
    protected String fieldA; 
} 

public class B extends A { 
    protected String fieldB; 
} 

public class C extends A { 
    protected String fieldC; 
} 

하기 전에, 여기에 주요 차이점은 A가 콘크리트 점이다 : 여기 내 클래스 계층 구조입니다. 다시 말해 Jackson은 json 필드를 타이 브레이커로 사용하여 3 가지 구현 중에서 선택해야합니다. (A)의 인스턴스에

{ 
    "fieldA": "asdf" 
} 

, 및 B의 인스턴스에

{ 
    "fieldA": "asdf", 
    "fieldB": "asdf" 
} 

: 기본적으로

, 어떻게 잭슨이 직렬화를하도록 구성 할 수 있습니다?

답변

3

자동으로 수행 할 방법이 없습니다. 모든 자동 다형 유형 처리는 일종의 유형 판별 자 (유형 특성, 가장 일반적으로)에 의존합니다. 컨텐츠 기반 휴리스틱 스를 사용할 수있는 능력이 요구되었지만, 지금까지 아무도 이와 같은 기능을 구현하기위한 실행 가능한 계획 (또는 기여도)을 제시하지 못했습니다.

처리하려면 사용자 정의 JsonDeserializer을 작성하고 직접 유형을 감지해야합니다. ConvertingDeserializer을 사용하면 Jackson이 JSON을 JsonNode 또는 java.util.Map으로 먼저 바인딩 한 다음 직접 추출 할 수 있습니다.