나는 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 객체가 비어 있다고 생각합니다.
(참고 :. 배열의 두번째 항목없이 위의 데이터는 잘 작동 즉, 우리는 적어도 "유형"이외의 다른 특성을 가지고 있기 때문에 푸 개체를 포함하는 목록에 직렬화 수)
을이 문제를 해결하는 방법에 대해 알고 싶습니다.
하나의 코멘트 : 당신은'@Type (value = Bar.class, name = "bar")'에 오타가 있습니다; 대신 "바"가되어야한다고 가정합니까? – StaxMan
어떤 Jackson 버전입니까? 버그 같아서 잭슨 1.x 개발 과정에서 수정되었습니다. – StaxMan
@StaxMan 그건 실제로 오타입니다. 고쳤다. 그러나 그것은 문제를 변화시키지 않습니다. – user2305793