2011-03-30 4 views
24

포함하는 클래스를 인스턴스화하지만,이 객체의 클래스는 잭슨이 인스턴스화 할 수 없습니다 추상적 필드를 포함하고 생성하지 않습니다하는 방법 목적. 무엇 예를 들어, 속성 이름잭슨 JSON 라이브러리 : 나는 자바 객체로 JSON 문자열을 변환 할 추상적 필드

setDefault(AbstractAnimal.class, Cat.class); 

또는 JSON을 기반으로 구현 클래스에 대해 결정과 같은 추상 클래스의 몇 가지 기본 구현에 대해 그에게 할 수있는 가장 쉬운 방법입니다. JSON 개체에 대한 :

{ 
    ... 
    cat: {...} 
    ... 
} 

난 그냥 프랑수아 것 :

setImpl("cat", Cat.class); 


나는 잭슨이 JSON 내부 클래스 정보를 포함하기에 가능하다고 알고 있지만, 나는 JSON 형식을 복잡하게하고 싶지 않아 I 용도. ,

xStream.alias("cat", Cat.class); 

그렇게 할 수있는 방법이 있나요 : 당신이 쓰는 XStream을 라이브러리처럼 - 내가, 또는 속성 이름 ('고양이')로 단지 기본 구현 클래스를 설정하여 사용하는 어떤 클래스를 결정하려면 특히 한 줄에서 또는 더 많은 코드가 필요합니까?

+0

Java에는 '추상 필드'와 같은 것이 없습니다. – EJP

+1

나는 무엇을 의미 하는가 : 'class C {동물 동물; }' 내가 Aniaml 추상적 인 C를 인스턴스화 할, 나는 동물 – Marcin

+0

확장이 필드 고양이에 넣을 때문에 아무 문제가 없다. 변수가 추상 유형이되는 것에 대한 규칙은 없습니다. – EJP

답변

36

여러 가지 방법이 있습니다. 버전 1.8 전에 간단한 방법은 어떻게 아마도 : 속성에 기반하여 결정하는에 관해서

@JsonDeserialize(as=Cat.class) 
public abstract class AbstractAnimal { ... } 

, 그 최선을 다하는 @JsonTypeInfo를 사용하여 수행 자동 embeddeding (필기) 입력 정보의 사용이다.

여러 유형의 정보 (클래스 이름, 논리적 형식 이름)의 종류뿐만 아니라 포함 메커니즘이있다 (포함로-재산권 등-래퍼 배열, 같은 래퍼 객체). 이 페이지 : https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization은 몇 가지 개념을 설명합니다.

+0

답변 해 주셔서 감사합니다! @JsonDeserialize는 내 문제에 이상적입니다. JSON에 모든 유형 정보를 임베드 할 필요가 없기 때문입니다. 그러나 다른 프로젝트의 일부이기 때문에 인스턴스화하려는 클래스를 수정할 수 없으며이 코드를 변경하면 다른 코드가 손상 될 수 있으므로이 방법을 사용할 수 없습니다. – Marcin

+4

내가 사용하는 구현을 동적으로 결정할 수 없기 때문에 주석이 매우 융통성이 없습니다. – Marcin

+1

수업을 수정하는 Wrt는 Jackson의 믹스 인 특수 효과를위한 것입니다. 그러나이 주석은 단 하나의 구현 유형이있는 경우에만 사용하기위한 것입니다. Jackson 1.8은 간단한 추상 형식 -> impl 형식 매핑을 허용하는 기능을 갖습니다. – StaxMan

2

아주 좋은 예와 전체 본격적인 대답은 여기에서 찾을 수 있습니다 : https://stackoverflow.com/a/30386694/584947

잭슨 다형성 역 직렬화로이를 말합니다.

그것은 확실히 내 문제를 도와주었습니다. 나는 데이터베이스에 저장하고있는 추상 클래스를 가지고 클래스의 구체적인 인스턴스에 그것을 비 정렬 화해야했습니다 (당연히).

그것은 제대로 부모 추상 클래스에 주석을 어떻게 방법의 비 정렬 화하면 실행시에 사용할 수있는 서브 클래스 후보자들 사이에서 선택하는 잭슨을 가르 칠하는 방법을 보여줍니다.

관련 문제