Джексон - сериализация сущностей с двунаправленными отношениями (избегая циклов)
У меня есть две сущности:
Parent {
Child[] children;
}
and
Child {
Parent parent;
}
Я знаю о @JsonBackReference
а также @JsonManagedReference
, Они хороши, если я сериализирую экземпляры Parent
,
Но мне также нужно передавать экземпляры Child
и я хочу иметь parent
поле заселено.
Другими словами:
- По сериализации
Parent
это должно иметьchildren
но их родительское поле может быть пустым (может быть решено с помощью справочных аннотаций json). - По сериализации
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 предоставил хорошую ссылку для начала