Джексон - сериализация сущностей с двунаправленными отношениями (избегая циклов)

У меня есть две сущности:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

Я знаю о @JsonBackReference а также @JsonManagedReference, Они хороши, если я сериализирую экземпляры Parent,

Но мне также нужно передавать экземпляры Child и я хочу иметь parent поле заселено.

Другими словами:

  1. По сериализации Parent это должно иметь children но их родительское поле может быть пустым (может быть решено с помощью справочных аннотаций json).
  2. По сериализации Child это должно иметь parent с их children (но children не должен иметь parent населен.

Есть ли способ решить это, используя стандартные возможности Джексона?

Т.е. пропустить сериализацию объектов, которые уже были сериализованы, вместо того, чтобы помечать поля, подходящие или не подходящие для сериализации.

2 ответа

Решение

Jackson 2.0 поддерживает полные циклические ссылки на объекты. См. Например, " Выпущен Jackson 2.0" (раздел "Обработка любых графов объектов, даже циклических!").

В основном вам нужно будет использовать новые @JsonIdentityInfo для типов, которые требуют обработки стиля id/idref. В вашем случае это будет как Parent а также Child типы (если один расширяет другой, просто добавьте его в супер тип, и это нормально).

Очень удобная реализация интерфейса предоставляется в библиотеке Джексона 2 как

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent { ....

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Child { ....

в Maven

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.2</version>
</dependency>

@StaxMan предоставил хорошую ссылку для начала

Другие вопросы по тегам