Używanie Jackson ObjectMapper do serializacji nazwy podklasy w JSON, a nie nadklasy

W następującym kodzie Jacksona / Javy, który serializuje obiekty w JSON, otrzymuję to:

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

Jednak to, co chcę uzyskać, to:

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

Czy jest coś, co mogę zrobić w AnimalContainer, aby uzyskać typ obiektu („psa”, „kota”) obiektu zamiast „zwierzęcia”)?(Edytować: Wiem, że nazwa mapy pochodzi od nazw metod getter i setter.) Jedynym sposobem, w jaki mogę pomyśleć o zrobieniu tego, jest posiadanie w AnimalContainer atrybutu każdego typu zwierząt, posiadanie setterów i getterów dla wszystkich z nich i wymuszanie, że tylko jeden jest wyceniany na raz. Ale to podważa cel posiadania superklasy zwierząt i wydaje się błędne. W moim prawdziwym kodzie mam tuzin podklas, nie tylko „psa” i „kota”. Czy jest lepszy sposób, aby to zrobić (być może używając adnotacji)? Potrzebuję również rozwiązania do deserializacji.

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 {} 
}

questionAnswers(3)

yourAnswerToTheQuestion