Java JSON-B的循环引用问题
我有两个相互引用的类。当我尝试将类序列化为Json时,我得到一个循环引用错误。谁能告诉我怎么纠正这个问题吗 我有一个文件夹类,其中包含密码列表:Java JSON-B的循环引用问题,java,json,Java,Json,我有两个相互引用的类。当我尝试将类序列化为Json时,我得到一个循环引用错误。谁能告诉我怎么纠正这个问题吗 我有一个文件夹类,其中包含密码列表: public class Folder { private List<Password> items = new ArrayList<>(); private String name; public Folder(String name) { this.name = name;
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 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)
当两个类相互引用时会出现此问题。您可以使用
GSONBuilder
使用setExclutionStrategies
方法获取自定义gson对象
GSON gsonObject = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
/** boolean method shouldSkipClass(Class<?> clz) */
/** boolean method shouldSkipField(FieldAttributes field) */
});
GSON gsonObject=new GsonBuilder()
.SetExclutionStrategy(新的ExclutionStrategy)(){
/**布尔方法shouldSkipClass(类clz)*/
/**布尔方法shouldSkipField(FieldAttributes字段)*/
});
在密码
或文件夹
中,您需要删除它们之间的引用(序列化)。您可以将@JsonbTransient
用于不希望在JSON中序列化的字段
(文件:)
示例:密码
类方法
示例:文件夹
类方法
@JsonbTransient
私有列表项=新的ArrayList();
现在由您决定哪个类不会显示对另一个类的引用。另外,请参见我使用的是JSON-B库,而不是GSON库。
GSON gsonObject = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() {
/** boolean method shouldSkipClass(Class<?> clz) */
/** boolean method shouldSkipField(FieldAttributes field) */
});
@JsonbTransient
private Folder mFolder;
@JsonbTransient
private List<Password> items = new ArrayList<>();