json - jackson self 引用导致循环

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

给我一个异常(exception):

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 注释)

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

关于json - jackson self 引用导致循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10446891/

相关文章:

java - jackson 检查可选字段

java - Jackson 使用稳定的二进制序列化吗?

java - 更好地记录 Jackson 解析错误

json - 错误 : Type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>' in type cast

ios - 无法将类型 '__NSCFConstantString' 的值转换为 'NSArray'

java - Spring-Data-JPA ManyToMany 关系与额外列

java - 双向导航。这是什么意思?

java - Hibernate 在读取之前永久清除所有现有数据

c - 从文件读取数据后动态存储数据

javascript - 从 JSON 中提取数据(外部 URL http ://) using AJAX?