多态中如何用@JsonTypeInfo控制@class
How to control @class with @JsonTypeInfo in polymorphism
我有一些像这样的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 没有。符合我的预期。
但是,当我将它应用于 class A 的实例时,“@class”显示在所有值上,即使它是 C 的实例。另一方面,我删除了 @JsonTypeInfo在 class B 上,“@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”在需要时显示?
此时,我需要重构我的模型结构,使用两个独立的class,一个class包含Id=CLASS,另一个是NONE.
希望有更好的解决办法。
我有一些像这样的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 没有。符合我的预期。
但是,当我将它应用于 class A 的实例时,“@class”显示在所有值上,即使它是 C 的实例。另一方面,我删除了 @JsonTypeInfo在 class B 上,“@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”在需要时显示?
此时,我需要重构我的模型结构,使用两个独立的class,一个class包含Id=CLASS,另一个是NONE.
希望有更好的解决办法。