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;
и Джексон будет сериализовать вещи так, чтобы выписывался только "ребенок" (родитель не); и при десериализации это связывает вещи.