import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.List; public class JacksonDeserializationTest2 { @org.junit.Test public void test() throws Exception { List bars = new ArrayList(); Bar bar1 = new Bar(); Foo p1 = new Foo(); p1.setObject(bar1); bar1.setFoo(p1); bars.add(bar1); RootEntity rootEntity = new RootEntity(); rootEntity.setBars(bars); ObjectMapper mapper = new ObjectMapper(); RootEntity deserialized = mapper.readValue(mapper.writeValueAsString(rootEntity),RootEntity.class); } @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") public static class BaseEntity { } @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") public static class RootEntity extends BaseEntity { private List bars; public List getBars() { return bars; } public void setBars(List bars) { this.bars = bars; } } public static class Foo extends BaseEntity { private BaseEntity object; public BaseEntity getObject() { return object; } public void setObject(BaseEntity object) { this.object = object; } } @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") public static class Bar extends BaseEntity { private Foo foo; public Foo getFoo() { return foo; } public void setFoo(Foo foo) { this.foo = foo; } } }