使用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)
在此先感谢您的任何建议!
使用Jackson 2.0-它处理循环引用(带有@JsonIdentityInfo注释)
@JsonIdentityInfo
如果您不能将注释直接添加到类中,请使用MixIn注释。此处的示例:https : //github.com/FasterXML/jackson- docs/wiki/JacksonMixInAnnotations