我有两个班级:
超类:
public class A
{
public int a;
public A(int a)
{
this.a = a;
}
}
子类:
public class B extends A
{
public B(int a)
{
super(a);
}
}
我使用Jackson来序列化/反序列化A& A的实例。乙
我希望将B类序列化为A 。我希望这是直截了当的,因为B没有任何成员。 但是我得到了杰克逊的一个例外,我发现的唯一解决方案是将B声明为A的子类型 - 我不想使用这个解决方案,因为这样B被序列化并反序列化为B. / p>
我的限制是我无法创建另一个类来包含A / B(容器)。
答案 0 :(得分:1)
如果您有容器类,Jackson应该反序列化为容器类中的类型。我已将A改名为Animal,B改名为Bird。
public class Container {
public Animal animal;
public Container() {}
public static class Animal {
public Animal() {}
public Animal(int age) {
this.age = age;
}
public int age;
}
public static class Bird extends Animal {
public Bird() {}
public Bird(int age) {
super(age);
}
}
}
使用Bird序列化Container对象然后对其进行反序列化时,它将成为Animal。
@Test
public void fromBirdToAnimal() throws IOException {
Container one = new Container();
one.animal = new Container.Bird(123);
String json = new ObjectMapper().writeValueAsString(one);
Container two = new ObjectMapper()
.readerFor(Container.class).readValue(json);
assertEquals(123, two.animal.age);
assertEquals(Container.Animal.class, two.animal.getClass());
}
如果无法使用容器类,但你知道你需要的类(继承树的根类),告诉ObjectMapper.readerFor
可以帮助你。
@Test
public void fromBirdToAnimal() throws IOException {
Container.Bird one = new Container.Bird(123);
String json = new ObjectMapper().writeValueAsString(one);
Container.Animal two = new ObjectMapper().readerFor(Container.Animal.class).readValue(json);
assertEquals(123, two.age);
assertEquals(Container.Animal.class, two.getClass());
}