Verwenden von Jackson ObjectMapper zum Serialisieren des Unterklassennamens in JSON, nicht in die Superklasse

Im folgenden Jackson / Java-Code, mit dem Objekte in JSON serialisiert werden, wird Folgendes angezeigt:

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

Was ich aber eigentlich bekommen möchte, ist folgendes:

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

Kann ich mit AnimalContainer etwas tun, um den Laufzeit-Typ ("Hund", "Katze") des Objekts anstelle von "Tier" zu erhalten?(Bearbeiten: Mir ist bekannt, dass der Kartenname von den Getter- und Setter-Methodennamen stammt.) Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, innerhalb von AnimalContainer ein Attribut für jeden Tiertyp zu haben, Setter und Getter für alle zu haben und durchzusetzen, dass jeweils nur einer bewertet wird. Aber dies macht dem Zweck der Tier-Superklasse ein Ende und scheint einfach falsch zu sein. Und in meinem realen Code habe ich tatsächlich ein Dutzend Unterklassen, nicht nur "Hund" und "Katze". Gibt es einen besseren Weg, um dies zu tun (vielleicht mit Anmerkungen irgendwie)? Ich brauche auch eine Lösung für die Deserialisierung.

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage