2

通常,在使用杰克逊进行多态反序列化时,我有一个映射到一个类的字符串字段,并且可以这样做。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "methodName")
@JsonSubTypes({
    @JsonSubTypes.Type(value = MyFirstClass.class, name = "firstClassName"),
    @JsonSubTypes.Type(value = MySecondClass.class, name = "secondClassName")}) 

如果值是整数而不是字符串,我找不到任何简单的示例来说明如何执行此操作。例如,如果我的 JSON 包含“methodName”:1 而不是“methodName”:“firstClassName”,我将如何选择要反序列化的类?

4

2 回答 2

1

没有“简单”的方法可以做到这一点。您必须编写自己的序列化机制实现,并为反序列化编写一个实现。这种实现的危险是如此之多,以至于您最好只引用您的 typeinfo 属性并将其用作字符串。

于 2013-07-31T18:54:22.450 回答
1

如果您只关心反序列化,则可以将name元素的值设置@JsonSubTypes.Type为整数的字符串表示形式。这将从 JSON 中的数字值正确反序列化。但是,在序列化时,它将序列化为该值的字符串表示形式而不是数字(例如"1",而不是1)。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "methodName")
@JsonSubTypes({
        @JsonSubTypes.Type(value = MyFirstClass.class, name = "1"),
        @JsonSubTypes.Type(value = MySecondClass.class, name = "2")})

或者,如果您愿意为该值添加一个复制值声明的方法,则可以使用更多样板代码将其序列化和反序列化为数字而不是字符串@JsonSubTypes.Type

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "methodName", include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({
        @JsonSubTypes.Type(value = MyFirstClass.class, name = "1"),
        @JsonSubTypes.Type(value = MySecondClass.class, name = "2")})
public static abstract class Superclass {
    public abstract int getMethodName();
}

public static class MyFirstClass extends Superclass {
    @Override
    public int getMethodName() {
        return 1;
    }
}

public static class MySecondClass extends Superclass {
    @Override
    public int getMethodName() {
        return 2;
    }
}
于 2019-06-26T23:26:27.127 回答