1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   | @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Zoo {     public Animal animal;
      public Zoo(Animal animal) {         this.animal = animal;     }
      @JsonTypeInfo(             use = JsonTypeInfo.Id.NAME,             include = JsonTypeInfo.As.PROPERTY,             property = "type")     @JsonSubTypes({             @JsonSubTypes.Type(value = Dog.class, name = "dog"),             @JsonSubTypes.Type(value = Cat.class, name = "cat")     })     @Getter     @NoArgsConstructor(access = AccessLevel.PRIVATE)     public static class Animal {         private String name;
          public Animal(String name) {             this.name = name;         }     }
      @JsonTypeName("dog")     @Getter     @NoArgsConstructor(access = AccessLevel.PRIVATE)     public static class Dog extends Animal {         public double barkVolume;
          public Dog(String name) {             super(name);         }     }
      @JsonTypeName("cat")     @Getter     @NoArgsConstructor(access = AccessLevel.PRIVATE)     public static class Cat extends Animal {         boolean likesCream;         public int lives;
          public Cat(String name) {             super(name);         }     }
  }
   |