我有两门课互相引用。当我试图将类序列化到Json时,我会得到一个循环引用错误。有人能告诉我怎么改正吗?
我有一个包含密码列表的文件夹类:
public class Folder {
private List<Password> items = new ArrayList<>();
private String name;
public Folder(String name) {
this.name = name;
}
public void add(Password password) {
items.add(password);
}
public List<Password> getItems() {
return items;
}
public void setItems(List<Password> items) {
this.items = items;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}然后,我有一个密码类,它引用文件夹类:
public class Password {
private String name;
private Folder mFolder;
public Password(String name, Folder folder) {
this.name = name;
folder.add(this);
mFolder = folder;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Folder getmFolder() {
return mFolder;
}
public void setmFolder(Folder mFolder) {
this.mFolder = mFolder;
}
}最后是主修班:
public class Main {
public static void main(String[] args) throws IOException {
Password password = new Password("Password", new Folder("Folder"));
Jsonb jsonb = JsonbBuilder.create();
try (Writer writer = new StringWriter()) {
jsonb.toJson(password, writer);
System.out.println(writer.toString());
}
}
}获取以下异常:
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91)
at org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:76)
at org.eclipse.yasson.internal.serializer.CollectionSerializer.serializeInternal(CollectionSerializer.java:35)
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:60)
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serializerCaptor(AbstractContainerSerializer.java:91)
at org.eclipse.yasson.internal.serializer.ObjectSerializer.marshallProperty(ObjectSerializer.java:92)
at org.eclipse.yasson.internal.serializer.ObjectSerializer.serializeInternal(ObjectSerializer.java:59)发布于 2019-01-14 03:26:10
在Password或Folder中,您需要删除它们之间的引用(在序列化中)。您可以将@JsonbTransient用于您不希望在JSON中序列化的字段。
(文档:http://json-b.net/docs/user-guide.html#ignoring-properties)
示例:Password类方法
@JsonbTransient
private Folder mFolder;示例:Folder类方法
@JsonbTransient
private List<Password> items = new ArrayList<>();现在由您决定哪个类不会显示对另一个类的引用。此外,请参见this
发布于 2019-01-08 07:45:55
当两个类相互引用时,会发生此问题。可以使用GSONBuilder使用setExclusionStrategies方法获取自定义gson对象。
GSON gsonObject = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
/** boolean method shouldSkipClass(Class<?> clz) */
/** boolean method shouldSkipField(FieldAttributes field) */
});https://stackoverflow.com/questions/54087178
复制相似问题