【发布时间】: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