Использование Jackson ObjectMapper для сериализации имени подкласса в JSON, а не суперкласса

В следующем коде Джексона / Java, который сериализует объекты в JSON, я получаю это:

{"animal":{"x":"x"}}

Однако, что я действительно хочу получить, это:

{"dog":{"x":"x"}}

Есть ли что-то, что я могу сделать с AnimalContainer, чтобы получить тип среды выполнения ("собака", "кошка") объекта, а неживотное»)? (Редактировать: Мне известно, что имя карты происходит от имен методов getter и setter.) Единственный способ, которым я могу придумать, это сделать в AnimalContainer атрибут каждого типа Animal, иметь сеттеры и геттеры для всех из них и обеспечить, чтобы за один раз оценивался только один. Но это побеждает цель иметь суперкласс Animal и кажется неправильным. И в моем реальном коде у меня на самом деле десяток подклассов, а не простособака" а также "кошка", Есть ли лучший способ сделать это (возможно, используя аннотации как-то)? Мне также нужно решение для десериализации.

public class Test
{
   public static void main(String[] args) throws Exception
   {
      AnimalContainer animalContainer = new AnimalContainer();
      animalContainer.setAnimal(new Dog());

      StringWriter sw = new StringWriter();   // serialize
      ObjectMapper mapper = new ObjectMapper(); 
      MappingJsonFactory jsonFactory = new MappingJsonFactory();
      JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(sw);
      mapper.writeValue(jsonGenerator, animalContainer);
      sw.close();
      System.out.println(sw.getBuffer().toString());
   }
   public static class AnimalContainer
   {
      private Animal animal;
      public Animal getAnimal() {return animal;}
      public void setAnimal(Animal animal) {this.animal = animal;}
   }
   public abstract static class Animal 
   {
      String x = "x";
      public String getX() {return x;}
   }
   public static class Dog extends Animal {}
   public static class Cat extends Animal {} 
}

Ответы на вопрос(3)

Ваш ответ на вопрос