2013-04-22 3 views
1

나는 Jackson의 다형성 질문이 있습니다. JSON 데이터를 다형 유형으로 deserialize하고 싶습니다. Jackson의 문서를 읽으면 JSON 데이터를 다형성 유형에 비 직렬화 할 수있다. 그러나 특별한 경우가 있습니다. 다음과 같은 클래스 구조가 있습니다 :Jackson Polymorphism 빈 JSON 객체 비 직렬화

class Supreme { 
    private String type; 
} 
class Foo extends Supreme { 
    public String label; 
} 
class Bar extends Supreme { 
} 

참고 : 클래스 막대에는 상속 된 "유형"필드 이외의 다른 멤버 변수가 없습니다.

나는 변화 한 그 구조 : new ObjectMapper().readValue(data, new TypeReference<List<Supreme>>());

내가 "는 END_TOKEN에서 클래스 바 역 직렬화 할 수 없습니다"와 같은 무언가를 얻을 : 내가 좋아하는 위의 JSON 데이터에 전달하면

@JsonTypeInfo(use =  JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property ="type") 
@JsonSubTypes({@Type(value = Foo.class, name = "Foo"),@Type(value = Bar.class, name = "Bar") }) 
class Supreme { 
} 
class Foo extends Supreme { 
    public String label; 
} 
class Bar extends Supreme { 
} 

String data= 
"[{ 
    "type": "Foo", 
    "label": "abc" 
}, 
{ 
    "type": "Bar" 
}]" 

. JsonTypeInfo 및 JsonSubTypes 주석은 "type"속성을 구문 분석하고 배열의 두 번째 엔터티를 Bar 클래스에 매핑해야한다는 것을 알았 기 때문입니다. 그러나 그것은 해당 엔티티의 type 속성 뒤에 "무언가"를 찾으려고 시도합니다. 즉, Jackson은 JSON 객체가 비어 있다고 생각합니다.

(참고 :. 배열의 두번째 항목없이 위의 데이터는 잘 작동 즉, 우리는 적어도 "유형"이외의 다른 특성을 가지고 있기 때문에 푸 개체를 포함하는 목록에 직렬화 수)

이 문제를 해결하는 방법에 대해 알고 싶습니다.

+0

하나의 코멘트 : 당신은'@Type (value = Bar.class, name = "bar")'에 오타가 있습니다; 대신 "바"가되어야한다고 가정합니까? – StaxMan

+0

어떤 Jackson 버전입니까? 버그 같아서 잭슨 1.x 개발 과정에서 수정되었습니다. – StaxMan

+0

@StaxMan 그건 실제로 오타입니다. 고쳤다. 그러나 그것은 문제를 변화시키지 않습니다. – user2305793

답변

1

실수로 저는 잭슨 1.5를 사용했습니다. 나는 잭슨 1.9에 부딪 쳤고 예외는 사라졌습니다. 그래서 Jackson 1.5에 버그가있었습니다.

+0

의미가 있습니다. :) – StaxMan