我有一个多态数据类型,我正试图将其反序列化为它的子类型(为了向后兼容性),但是如果没有类型信息,我就无法反序列化,即使我是直接引用对象映射程序上的readValue
调用中的子类型。我能用杰克逊的魔法来解决这个问题吗?
class SerializationTest {
@Test
fun serializationTest() {
val serializedFoo = """ {"base":"blah", "foo": "something"} """
val foo = ObjectMapper().registerModule(KotlinModule()).readValue(serializedFoo, Foo::class.java)
println(foo)
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
@JsonSubTypes(
JsonSubTypes.Type(value = Foo::class),
JsonSubTypes.Type(value = Bar::class)
)
internal abstract class Base {
abstract val base: String
}
internal class Foo(@JsonProperty("base") override val base: String,
@JsonProperty("foo") val foo: String): Base()
internal class Bar(@JsonProperty("base") override val base: String,
@JsonProperty("foo") val bar: String): Base()
}
失败与
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.foo.bar.SerializationTest$Foo]: missing type id property '@class'
我目前使用的是jackson 2.9.8
发布于 2020-03-02 06:07:11
如果可以在JsonTypeInfo.Id.NONE
中指定具体类,则可以使用objectmapper.readValue
。
为了完整性,来自NONE
的javadoc
--这意味着不包含显式类型元数据,而且输入纯粹是使用上下文信息完成的,可能还会添加其他注释。
下面是一个Java测试用例:
public class SerializationTest {
@Test
public void serializationTest() throws JsonParseException, JsonMappingException, IOException {
final String json = getSerializedFoo();
final ObjectMapper om = getObjectMapper();
final Foo value = om.readValue(json, Foo.class);
assertTrue(value != null);
}
private ObjectMapper getObjectMapper() {
final ObjectMapper om = new ObjectMapper();
return om;
}
private String getSerializedFoo() {
return "{\"base\": \"blah\", \"foo\": \"something\"}";
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
@JsonSubTypes({
@Type(value = Foo.class),
@Type(value = Bar.class)
})
abstract class Base {
@JsonProperty("base")
protected String base;
public String getBase() {
return base;
}
public void setBase(final String base) {
this.base = base;
}
}
class Bar extends Base {
@JsonProperty("bar")
private String bar;
public String getBar() {
return bar;
}
public void setBar(final String foo) {
bar = foo;
}
}
class Foo extends Base {
@JsonProperty("foo")
private String foo;
public String getFoo() {
return foo;
}
public void setFoo(final String foo) {
this.foo = foo;
}
}
https://stackoverflow.com/questions/60442676
复制相似问题