Самостоятельная привязка Джексона к циклу
У меня проблема при преобразовании объектов спящего режима в JSON с Jackson, потому что некоторые объекты имеют самооценку в своем определении.
Проблема в том, что я не контролирую код этих объектов, поэтому я не могу размещать там аннотации.
На самом деле я хотел бы просто ограничить глубину рекурсии, например, до 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
Используйте Jackson 2.0 - он обрабатывает циклические ссылки (с аннотацией @JsonIdentityInfo
)
Если вы не можете добавлять аннотации непосредственно к классу, используйте аннотации MixIn. Пример здесь: http://wiki.fasterxml.com/JacksonMixInAnnotations