尝试使用Jackson从Idml序列化到Json时出现StackOverflowError

时间:2012-10-02 12:37:13

标签: java json jackson idml

使用IDMLlib将IDML文件加载到POJO,但是当我尝试使用Jackson JSON将生成的java对象序列化为JSON时,我一直遇到无限递归问题。

Caused by JsonMappingException: Infinite recursion (StackOverflowError)
(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是一个类似的。

我使用Jackson的ObjectMapper将POJO转换为JSON:

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

编译IDMLlib类,因此我无法对它们进行任何更改 任何人都知道一种方法我仍然可以使用java对象IDMLlib返回而不必创建自己的?

编辑:
似乎有很多提及" root"和父母"始终。基本上我要问的是,如果有人知道如何在不修改对象的情况下序列化对象

2 个答案:

答案 0 :(得分:0)

由于某些原因,杰克逊无法访问该对象的某个属性,或者无法序列化其中一个属性,因此杰克逊倾向于抛出此类异常。

如果你没有在要序列化的对象上指定任何注释,杰克逊会尝试通过深入到递归来序列化所有内容。

你有没有机会告诉杰克逊忽略某些属性或领域?

我有过使用Hibernate初始化Pojo的经验,我应该将“@JacksonIgnore”添加到我使用Hibernate Lazy加载的每个属性中。

答案 1 :(得分:0)

如果引用是一个简单的父/子类型的东西(它听起来像是),只需使用注释:

// on parent object
@JsonManagedReference
public ChildOb child;

// on child object
@JsonBackReference ParentOb parent;

杰克逊将序列化事物,以便只写出“孩子”(父母不会);当反序列化时,它会重新链接。