当前位置: 首页 > 面试题库 >

Jackson自我参考导致周期

唐康安
2023-03-14
问题内容

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

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



 类似资料:
  • 问题内容: 使用Jackson将休眠对象转换为JSON时,我遇到了问题,因为某些对象在其定义中具有自引用。问题是我无法控制这些实体的代码,因此无法在其中放置注释。 实际上,我只想将递归的深度限制为例如5个级别。我需要与包含自我引用的任何实体对象一起工作的通用代码。可能吗?我不介意使用另一个JSON库。 下面的简单代码 给我例外: 在此先感谢您的任何建议! 问题答案: 使用Jackson 2.0-

  • 问题内容: 我只是想知道我是否正确理解了这一点。因此,根据苹果公司的文档,当您将闭包作为类实例的属性创建并且闭包引用self(创建闭包属性的类)时,这将导致强大的保留周期,最终该类或闭包都不会被释放。因此,用外行术语来说,这意味着如果我有一个具有属性的类并且该属性是一个闭包,并且一旦我在声明闭包属性的类中分配了该闭包的功能,就会导致强烈的保留周期。这是我的意思的简单例子 这最终导致了一个保留周期,

  • 问题内容: 我想将jackson json库用于通用方法,如下所示: … 现在的问题是,当我调用请求对象内部的getMyObject()时,杰克逊将嵌套的自定义对象作为LinkedHashMap返回。有什么方法可以指定需要返回T对象吗?例如:如果我发送了类型为Customer的对象,则应该从该List?中返回Customer。 谢谢。 问题答案: 这是Java类型擦除的一个众所周知的问题:T只是一

  • 启用proguard规则后,我在向网络发送任何内容之前遇到以下错误。 java.lang.RuntimeException:无法将FormDocTankPermission转换为RequestBody 引起的 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类FormDocTankPermission的序列化程序,也

  • 问题内容: 我想将jackson json库用于通用方法,如下所示: … 现在的问题是,当我调用位于请求对象内的getMyObject()时,杰克逊将嵌套的自定义对象作为LinkedHashMap返回。有什么方法可以指定需要返回T对象吗?例如:如果我发送了类型为Customer的对象,则应该从该List?中返回Customer。 问题答案: 这是Java类型擦除的一个众所周知的问题:T只是一个类型

  • 问题内容: 我正在尝试使用Selenium的ChromeDriver驱动程序来使用Chrome运行某些测试,但是使用时出现参考错误。 我想强制使用某些选项,例如针对特定的用户配置文件对其进行测试。根据Selenium和ChromeDriver文档,这是我的文件: 错误 我正在使用命令执行此操作。这会在第一行上引发以下错误: 值得一提的是,如果我跳过设置选项,并以此替换脚本的前四行,则可以使用,但是