我想使用Jakson反序列化嵌套多態類型。這意味着我的最高級別類型反映了另一個多態類型,最終由不是抽象類的類擴展。這不起作用,它會引發異常。傑克遜反序列化嵌套多態類型
這是我試圖做的一個簡化例子。
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文檔。我在「第一級」有一個抽象類型,描述了對單個值的操作。我派生了一堆非抽象的類來實現常用操作(我使用@JsonSubTypes對它們進行了註釋)。
我有一個被稱爲「定製」特殊@JsonSubTypes。這是另一個表示別人編寫的自定義操作的抽象類(在普通jar外),它們可以使用「@class」屬性指定完全限定的類名。它看起來像Jakson解析器從不讀取第二個lavel類中的@JsonTypeInfo註釋。
我該如何做這項工作。或者至少我怎樣才能使這個用例起作用。