이 작성하지 않은 부울 JSON 속성을 사용하여 콘크리트 subsclass하기 위해 할 수있는 잭슨 직렬화?

M_M :

직렬화를 내가 직렬화를 제어 할 말을하는 것입니다,하지만 - 나는 다른 곳에서받은 JSON 파일을 역 직렬화하는 잭슨을 사용하고 있습니다.

하자가 JSON이 수생 및 육상 동물의 혼합물로 단순 목록을 설명 말한다.

동물 JSON 특성 중 하나는 부울입니다 isAquatic. 자바에서, AquaticAnimal그리고 LandAnimal별도의 클래스, 추상 클래스의 각 서브 클래스 Animal동물의 두 아형과 관련 회원 데이터를 포함합니다. 동물은 다른 서브 클래스가없는, 그리고지지 않습니다 않습니다. 수생 동물에 아무 의미도하지 않습니다 아가미와 같은 속성을 가지고 LandAnimal(및 따라서는 LandAnimaljson으로 이러한 속성을하지 않아도되며, 서브 클래스가 관련된 동작을 제공합니다). 마찬가지로, 동일한 발을 가질 수있는, 육지 동물에 대한 역에 사실, 폐 등 (그것은 완벽한 예 아니지만, 그것의 목적을 제공)

직렬화 복원 때, 나는 값을 사용하려면 isAquatic사용할 서브 클래스를 결정하는 I는 다음 작업을 수행 할 때 :

Animal animal = mapper.readValue( ... , Animal.class);

잭슨으로 직렬화 할 때 다형성을 다루는 모든 예는 JSON에 참여 쓰기 여분의 데이터를 가지고,하지만 난 쉽게 할 수 있도록 난 단지, 데이터의 읽고 있어요. 내가 그렇게하고 싶습니다 그래서 그러나, 나는 JSON 이미 정보에서 올바른 클래스를 확인할 수 있습니다.

나는 완전히 잭슨 태그를 이해하지 않지만, 다른 예에 따라, 나는 이런 식으로 뭔가를 할 수 있도록하고 싶습니다 :

@JsonSubTypes({
    @JsonSubTypes.Type(value = LandAnimal.class, isAquatic = false),

    @JsonSubTypes.Type(value = AquaticAnimal.class, isAquatic = true) }
)
public abstract class Animal {
    ...

나는이 그 주석이 사용하기위한 것입니다하지 어떻게 확신하지만 잘하면 내가 할 노력하고있어 설명합니다.

사람이 잭슨이 작업을 수행하고, 만약 그렇다면, 어떻게 할 수 있는지 여부를 말해 줄 수 있습니까?

locus2k :

그것은 몇 가지 좋은 편리한 멋쟁이 표기 작업 가능합니다 :

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "isAquatic")
@JsonSubTypes({
    @JsonSubTypes.Type(value = LandAnimal.class, name = "false"),
    @JsonSubTypes.Type(value = AquaticAnimal.class, name = "true") 
})
public abstract class Animal {
    private String isAquatic;
    ...

이것은 당신에게 재산을 취할 것 isAquatic와 JSON 유형 필드에 MAPE name다음 그 이름이 무엇인지에 따라 적절한 클래스를 반환;

참고 : 난 단지 때문에 내가 만든 이유 문자열입니다 필드가이 방법을 수행 한 isAquatic문자열을, 당신은 논리 값으로 작동하는지 확인하기 위해 다른 방법을 시도 할 수 있습니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=364080&siteId=1