StackruError при попытке сериализации из Idml в Json с Джексоном

Я использовал IDMLlib для загрузки файлов IDML в POJO, но когда я пытаюсь сериализовать полученный Java-объект в JSON с помощью Jackson JSON, у меня возникают проблемы с бесконечной рекурсией.

Caused by JsonMappingException: Infinite recursion (StackruError)
(through reference chain: 
de.fhcon.idmllib.api.elements.preferences.Preferences["layoutAdjustmentPreference"]
->de.fhcon.idmllib.api.elements.preferences.LayoutAdjustmentPreference["parent"]
... etc

->>  539 | serializeFields in com.fasterxml.jackson.databind.ser.std.BeanSerializerBase

Это происходит несколько раз во время синтаксического анализа.
Idml.document -> Document.root -> Idml.document -> Document.root аналогичен.

Я использую ObjectMapper Джексона для преобразования POJO в JSON:

Idml idml = new Idml("test.idml");
ObjectMapper mapper = new ObjectMapper();
String JSONstring = mapper.writeValueAsString(idml);

Классы IDMLlib скомпилированы, поэтому я не могу вносить в них изменения.
Кто-нибудь знает, как я могу по-прежнему использовать Java-объект IDMLlib возвращает без необходимости создавать свой собственный?

РЕДАКТИРОВАТЬ:
Похоже, что существует множество ссылок на "root" и "parent". Итак, в основном я спрашиваю, знает ли кто-нибудь, как можно сериализовать объект без его изменения.

2 ответа

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

Если вы не укажете аннотацию для объекта, который собираетесь сериализовать, Джексон попытается все сериализовать, углубившись в рекурсию.

Нет никакого шанса, что вы можете сказать Джексону игнорировать некоторые свойства или поля?

У меня был опыт инициализации Pojo в Hibernate, и я должен добавить "@JacksonIgnore" к каждому свойству, которое у меня было при загрузке Hibernate Lazy.

Если ссылка является простой вещью типа родитель / потомок (что звучит так, как есть), просто используйте аннотации:

// on parent object
@JsonManagedReference
public ChildOb child;

// on child object
@JsonBackReference ParentOb parent;

и Джексон будет сериализовать вещи так, чтобы выписывался только "ребенок" (родитель не); и при десериализации это связывает вещи.

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