Если у вас есть класс контейнера , Джексон должен десериализоваться до типа в классе контейнера.Я переименовал 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, а затем десериализации его, он становится 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());
}