중첩 된 다형성 형식을 deserialize하기 위해 Jakson을 사용하려고합니다. 내 최상위 형식이 다른 추상 형식이 아닌 클래스에 의해 확장 된 다른 다형성 형식을 참조 함을 의미합니다. 이것은 작동하지 않으며 예외가 발생합니다.중첩 된 다형성 형식을 deserializing하는 잭슨
다음은 내가하려는 일의 축소 된 예입니다.
package com.adfin;
import junit.framework.TestCase;
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.map.ObjectMapper;
import java.io.IOException;
public class JaksonDouble extends TestCase {
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "name"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = SecondLevel.class, name = "SECOND")
})
public static abstract class FirstLevel {
public abstract String getTestValue();
}
@JsonTypeInfo(
use = JsonTypeInfo.Id.CLASS,
include = JsonTypeInfo.As.PROPERTY,
property = "@class"
)
public static abstract class SecondLevel extends FirstLevel {
}
public static class FinalLevel extends SecondLevel {
String test;
@Override public String getTestValue() { return test; }
}
public void testDoubleAbstract() throws IOException {
String testStr = "{ \"name\": \"SECOND\", \"@class\": \"com.adfin.JasksonDouble.FinalLevel\", \"test\": \"foo\"}";
ObjectMapper mapper = new ObjectMapper();
FirstLevel result = mapper.readValue(testStr, FirstLevel.class);
}
}
추상적 인 유형에 대해서는 표준 예외가 있습니다.
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.adfin.JaksonDouble$SecondLevel, problem: abstract types can only be instantiated with additional type information at [Source: [email protected]; line: 1, column: 19]
사용 사례를 설명해 드리겠습니다. 데이터 흐름을 설명하는 Json 문서가 있습니다. 나는 하나의 값에 대한 연산을 기술하는 "레벨 1"에 추상 타입을 가지고있다. 일반적인 작업을 구현하는 추상 클래스가 아닌 클래스를 파생시킵니다 (모든 클래스에 @JsonSubTypes 주석을 추가합니다).
"CUSTOM"이라는 특수한 @JsonSubTypes가 있습니다. 이것은 다른 누군가가 작성한 사용자 정의 연산을 나타내는 또 다른 추상 클래스이며 (일반 항아리 외부) "@class"속성을 사용하여 정규화 된 클래스 이름을 지정할 수 있습니다. Jakson 파서가 두 번째 lavel 클래스에서 @JsonTypeInfo 주석을 읽지 않는 것처럼 보입니다.
어떻게하면됩니까? 아니면 적어도이 유스 케이스를 어떻게 작동시킬 수 있을까요?