package com.baeldung.jackson.annotation; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.annotation.JsonTypeName; public class Zoo { public Animal animal; public Zoo() { } public Zoo(final Animal animal) { this.animal = animal; } @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "dog"), @JsonSubTypes.Type(value = Cat.class, name = "cat") }) public static class Animal { public String name; public Animal() { } public Animal(final String name) { this.name = name; } } @JsonTypeName("dog") public static class Dog extends Animal { public double barkVolume; public Dog() { } public Dog(final String name) { this.name = name; } } @JsonTypeName("cat") public static class Cat extends Animal { boolean likesCream; public int lives; public Cat() { } public Cat(final String name) { this.name = name; } } }