一尘不染

Jackson自我参考导致周期

hibernate

使用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:直接自引用导致循环(通过参考链: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)

在此先感谢您的任何建议!


阅读 222

收藏
2020-06-20

共1个答案

一尘不染

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

如果您不能将注释直接添加到类中,请使用MixIn注释。此处的示例:https : //github.com/FasterXML/jackson-
docs/wiki/JacksonMixInAnnotations

2020-06-20