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

У меня есть два объекта:

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 предоставил хорошую ссылку для начала с