杰克逊自我引用导致循环

时间:2012-05-04 10:16:44

标签: json hibernate jackson


使用Jackson将hibernate对象转换为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: Direct self-reference leading to cycle (through reference chain: com.fgm.imsma.pojo.Hazard["location"]->com.fgm.imsma.pojo.Location["location"])
    at org.codehaus.jackson.map.ser.BeanPropertyWriter._reportSelfReference(BeanPropertyWriter.java:473)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:411)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:587)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:245)
    at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:1993)
    at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1595)
    at imsma.json.GetObjects.main(GetObjects.java:47)

提前感谢任何建议!

1 个答案:

答案 0 :(得分:20)

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

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