我试图使用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: java.io.StringReader@f2a55aa; line: 1, column: 19]
让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“第一级”上有一个抽象类型,描述单个值的操作。我派生了一堆不是抽象的类,实现常见的操作(我用@JsonSubTypes注释了所有这些类)。
我有一个特殊的@JsonSubTypes,叫做“CUSTOM”。这是另一个抽象类,表示其他人编写的自定义操作(在正常jar之外),他们可以使用“@class”属性指定完全限定的类名。看起来Jakson解析器从不读取第二层类上的@JsonTypeInfo注释。
如何使这个工作。或者至少如何使这个用例工作。