Джексон - сериализация сущностей с двунаправленными отношениями (избегая циклов)
У меня есть два объекта:
Parent {
Child[] children;
}
and
Child {
Parent parent;
}
Я знаю о @JsonBackReference
и @JsonManagedReference
.
Они хороши, если я сериализую экземпляры Parent
.
Но мне также нужно передать экземпляры Child
, и я хочу, чтобы поле Parent
заполнялось.
Другими словами:
- При сериализации
Parent
он должен иметь children
, но их родительское поле может быть пустым (может быть решено с помощью аннотаций json).
- При сериализации
Child
он должен иметь Parent
с их children
(но children
не должно быть заполнено Parent
.
Есть ли способ решить эту проблему, используя стандартные возможности Джексона?
т.е. пропустить сериализацию объектов, которые уже были сериализованы вместо того, чтобы маркировать поля, подходящие или не имеющие права на сериализацию.
Ответы
Ответ 1
Jackson 2.0 поддерживает ссылки на все циклические объекты. См. "" Джексон 2.0 выпущен "(раздел" Обрабатывать любые графические объекты, даже циклические!") Для примера.
В принципе, вам нужно будет использовать новый @JsonIdentityInfo
для типов, для которых требуется обработка стиля id/idref. В вашем случае это будут как типы Parent
, так и Child
(если один расширяет другой, просто добавьте его в супер-тип и это прекрасно).
Ответ 2
очень удобная реализация интерфейса предоставляется в библиотеке jackson 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 предоставил хорошую ссылку для начала с