杰克逊自我引用导致循环 [英] jackson self reference leading to cycle

查看:353
本文介绍了杰克逊自我引用导致循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



用Jackson将hibernate对象转换成JSON时有问题,因为有些对象在其定义中有一个自引用。
问题是我不控制这些实体的代码,所以我不能把注释放在那里。



其实我只想限制深度的递归性,例如5个级别。我需要与包含自引用的任何实体对象一起工作的通用代码。是否有可能?
我不介意使用另一个JSON库。



以下简单代码

  ObjectMapper mapper = new ObjectMapper(); 

Query q = session.createQuery(from Hazard);
列出< Hazard>危险= q.list();

(危险h:危险){
字符串危险Json;
hazardJson = mapper.writeValueAsString(h);
}

给我例外:

 
org.codehaus.jackson.map.JsonMappingException:直接引用循环的自引用(通过引用链: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.codeh aus.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)
在org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1595)
在imsma.json.GetObjects。 main(GetObjects.java:47)

感谢您提出任何建议!

解决方案

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

如果您无法添加注释直接到类然后使用MixIn注释。这里有一个例子: http://wiki.fasterxml.com/JacksonMixInAnnotations



I have a problem when converting hibernate objects to JSON with Jackson, because some objects have a self-reference in their definition. The problem is that I don't control the code of those entities so I cannot put annotations in there.

Actually I would like to just limit the depth of the recursivity, for example to 5 levels. I need generic code that works with any entity object that contains self reference.. Is it possible? I don't mind use another JSON library.

The following simple code

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);
}

Gives me exception:

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)

Thanks in advance for any suggestions!

解决方案

Use Jackson 2.0 - it handles cyclic references (with @JsonIdentityInfo annotation)

If you cannot add annotations directly to the class then use MixIn annotations. An example here: http://wiki.fasterxml.com/JacksonMixInAnnotations

这篇关于杰克逊自我引用导致循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆