当前位置: 首页 > 知识库问答 >
问题:

尝试使用Jackson从Idml序列化到Json时出现StackOverflow错误

宣瀚
2023-03-14

一直在使用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-

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

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

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

编辑:
似乎有许多对“根”和“父”的引用。因此,基本上我要问的是,是否有人知道如何在不修改对象的情况下序列化对象。

共有2个答案

邓嘉致
2023-03-14

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

// on parent object
@JsonManagedReference
public ChildOb child;

// on child object
@JsonBackReference ParentOb parent;

而且杰克逊会把东西序列化,这样就只写出‘孩子’(parent不是);当反序列化时,它重新链接东西。

江飞章
2023-03-14

当 Jackson 由于某些原因无法访问对象的某个属性,或者无法序列化其某个属性时,Jackson 倾向于抛出这种异常。

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

你有没有可能告诉杰克逊忽略一些属性或领域?

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

 类似资料:
  • 我试图使用混合序列化集合,但Jackson不会保存类型信息。这是一个基本测试,说明会发生什么: 如何在第一个输出上实现输出?

  • 我目前正在将一些代码从Jackson1.x迁移到Jackson2.5json映射器,遇到了一个1.x中没有的问题。 这是设置(参见下面的代码): 接口IPET 类Dog实现IPET IPET使用@jsonTypeInfo和@jsonSubtypes进行注释 类Human具有一个类型为IPet的属性,该属性使用@JSONSerialize(using=CustompetSerializer.clas

  • 我尝试反序列化一个巨大的API负载。这个有效负载包含的字段比我需要的要多,因此我正在使用。但是,在某些情况下,反序列化会失败,并显示错误消息: 我找到了解决方案,建议使用 我试过这个。但这于事无补。此外,我的结果数据不是一个单一的值数组。它实际上包含两个值——因此解决方案无论如何都不会相加。 以下是反序列化的目标类。 下面是我测试它的单元测试: 这是我想要反序列化的有效负载

  • 我正在尝试使用Jackson将对象序列化到JSON,以便字段名基于一种类型的字段。 我有和这个线程中的OP一样的问题: 然而,这并不奏效。 我正在使用Wildfly 10.1 Final null CustomSerializer类: > 将注释添加到object字段,因此我的Response类现在如下所示: 当我测试它时,我得到了以下json对象: 现在,我尝试了本博客中的建议,并在我的Resp

  • 考虑以下代码片段,以获取/提交collections.synchronizedSet到/从Hazelcast: 在此代码运行几次之后(不确定有多少次,也不确定为什么),在试图从Hazelcast(上面标记的)获取集合时,会触发以下操作: