【问题标题】:jackson self reference leading to cycle杰克逊自我参考导致循环
【发布时间】:2012-05-13 21:12:32
【问题描述】:


使用 Jackson 将休眠对象转换为 JSON 时出现问题,因为某些对象在其定义中具有自引用。 问题是我无法控制这些实体的代码,所以我无法在其中添加注释。

实际上,我只想限制递归的深度,例如限制为 5 个级别。我需要适用于任何包含自引用的实体对象的通用代码。这可能吗? 我不介意使用另一个 JSON 库。

以下简单代码

ObjectMapper mapper = new ObjectMapper();

Query q = session.createQuery("from Hazard ");
List<Hazard> hazards = q.list();

for (Hazard h : hazards) {
    String hazardJson;
    hazardJson = mapper.writeValueAsString(h);
}

给我例外:

org.codehaus.jackson.map.JsonMappingException:直接自引用导致循环(通过引用链:com.fgm.imsma.pojo.Hazard["location"]->com.fgm.imsma.pojo.Location["location "]) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter._reportSelfReference(BeanPropertyWriter.java:473) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:411) 在 org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) 在 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 在 org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) 在 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 在 org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:587) 在 org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:245) 在 org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:1993) 在 org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1595) 在 imsma.json.GetObjects.main(GetObjects.java:47)

提前感谢您的任何建议!

【问题讨论】:

    标签: json hibernate jackson


    【解决方案1】:

    使用Jackson 2.0 - 它处理循环引用(带有@JsonIdentityInfo 注释)

    如果您不能直接向类添加注释,请使用 MixIn 注释。这里有一个例子:https://github.com/FasterXML/jackson-docs/wiki/JacksonMixInAnnotations

    【讨论】:

    • 谢谢,但正如我在原帖中所写,我不能在实体代码中添加注释,因为它是第 3 方软件。这可以通过映射器的一些动态配置来完成吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2018-07-29
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2017-12-25
    相关资源
    最近更新 更多