首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用"InvalidTypeIdException“将Jackson多态反序列化为特定的子类型失败

用"InvalidTypeIdException“将Jackson多态反序列化为特定的子类型失败
EN

Stack Overflow用户
提问于 2020-02-27 22:30:31
回答 1查看 1.8K关注 0票数 1

我有一个多态数据类型,我正试图将其反序列化为它的子类型(为了向后兼容性),但是如果没有类型信息,我就无法反序列化,即使我是直接引用对象映射程序上的readValue调用中的子类型。我能用杰克逊的魔法来解决这个问题吗?

代码语言:javascript
运行
复制
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()
}

失败与

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-03-02 06:07:11

如果可以在JsonTypeInfo.Id.NONE中指定具体类,则可以使用objectmapper.readValue

为了完整性,来自NONE的javadoc

--这意味着不包含显式类型元数据,而且输入纯粹是使用上下文信息完成的,可能还会添加其他注释。

下面是一个Java测试用例:

代码语言:javascript
运行
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60442676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档