【问题标题】:json jackson encoding - StackOverflowErrorjson杰克逊编码 - StackOverflowError
【发布时间】:2015-12-09 16:55:14
【问题描述】:

我正在尝试将 java 对象转换为 json 字符串,但由于 StackoverflowError 失败,可能是因为对象的子对象中存在无限循环/循环。

    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:505)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:639)
Caused by: java.lang.StackOverflowError
    at java.lang.ClassLoader.defineClass1(Native Method)
...
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:655)

我试图编码的对象是我无法控制的类的一个实例。我只能对它进行子类化。我想我应该能够在有罪的字段上添加@JsonIgnore(我的意思是在相应的被覆盖的 getter 方法上),但我不知道它是哪一个。这些是具有数百个字段和子对象的巨大类。

有没有一种简单的方法可以知道是什么字段导致了 json 编码中的无限循环?

PS:对于熟悉的人来说,它是 Hl7 HAPI FHIR 框架的Patient 类。我知道该框架附带了一个自定义 json 序列化器,但我需要使用更通用的杰克逊序列化器来利用它的一些功能。

非常感谢

【问题讨论】:

  • 大概你有一个循环引用。检查那些对象并从那里继续。
  • 是的,这就是我所说的“无限循环/循环”的意思。但我的问题是如何在该实例的数百个字段和子对象中找到它:-)
  • 如果你不需要 JSON,那么 Java 序列化会自己处理。如果您必须拥有 JSON,那么您可能需要一整天的时间来了解您正在序列化的到底是什么......
  • 我有同样的问题,这是一个基本要求。很高兴知道问题出在哪里。 (FHIR 患者图中导致 json 序列化失败的原因)(spring boot 2.3.4.RELEASE)

标签: java json jackson hl7-fhir


【解决方案1】:

如果您的对象图具有循环依赖关系,就会发生这种情况。据我所知,没有一种简单的方法可以找到循环。你可以@Ignore一切,然后分批重新引入字段,看看它在哪里中断。

如果您只是为了使用@Ignore 进行注释而进行子类化,那么您应该查看Jackson Mixins

【讨论】:

    【解决方案2】:

    通常例外情况仍应包括包含图(循环形成的属性名称);这里不是这样吗?

    【讨论】:

    • 不 :-(,我在问题中发布的堆栈的前 3 行重复了数百次。
    • 这很奇怪,因为BeanSerializer确实捕获了StackOverflowError,重新打包为映射异常,所以虽然异常的深度可能很大,但第一行应该指出一些关于形成的属性周期。确保使用最新版本(2.6.4 是最新版本)。
    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2018-08-10
    相关资源
    最近更新 更多