如何在多态性中用@JsonTypeInfo控制@class



我有一些像这样的类结构

class A {
    private List<B> b;
    public List<B> getB() {
        return b;
    }
    public void setB(List<B> b) {
        this.b = b;
    }
}
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="@class")
abstract class B {
}
@JsonTypeInfo(use=Id.NONE)
class C extends B {
}
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="@class")
class D extends B {
}

当我使用ObjectMapper (fasterxml)以JSON格式编写时,例如C和D, D有"@class",而C没有。这符合我的期望。

然而,当我在类A的实例上应用它时,"@class"显示在所有值上,即使它是c的实例。另一方面,我在类B上删除@JsonTypeInfo,"@class"不存在,即使它是d的实例。

这是我的测试代码
List<B> list = new ArrayList<B>();
    list.add(new D());
    list.add(new C());
    list.forEach(p->{try {
        System.out.println(mapper.writeValueAsString(p));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }});
    A a = new A();
    a.setB(list);
    System.out.println(mapper.writeValueAsString(a));

我怎样才能使"@class"在需要的时候显示?

此时,我需要通过使用两个分离的类来重构我的模型结构,一个类包含Id= class,另一个是NONE。

我希望有更好的解决办法。

最新更新