首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON-B的循环引用问题

JSON-B的循环引用问题
EN

Stack Overflow用户
提问于 2019-01-08 07:37:46
回答 2查看 1.1K关注 0票数 1

我有两门课互相引用。当我试图将类序列化到Json时,我会得到一个循环引用错误。有人能告诉我怎么改正吗?

我有一个包含密码列表的文件夹类:

代码语言:javascript
复制
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;
    }       
}

然后,我有一个密码类,它引用文件夹类:

代码语言:javascript
复制
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;
    }    
}

最后是主修班:

代码语言:javascript
复制
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());
        }
    }    
}

获取以下异常:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-14 03:26:10

PasswordFolder中,您需要删除它们之间的引用(在序列化中)。您可以将@JsonbTransient用于您不希望在JSON中序列化的字段。

(文档:http://json-b.net/docs/user-guide.html#ignoring-properties)

示例:Password类方法

代码语言:javascript
复制
@JsonbTransient
private Folder mFolder;

示例:Folder类方法

代码语言:javascript
复制
@JsonbTransient
private List<Password> items = new ArrayList<>();

现在由您决定哪个类不会显示对另一个类的引用。此外,请参见this

票数 4
EN

Stack Overflow用户

发布于 2019-01-08 07:45:55

当两个类相互引用时,会发生此问题。可以使用GSONBuilder使用setExclusionStrategies方法获取自定义gson对象。

代码语言:javascript
复制
GSON gsonObject = new GsonBuilder()
    .setExclusionStrategies(new ExclusionStrategy() {
     /** boolean method shouldSkipClass(Class<?> clz) */
     /** boolean method shouldSkipField(FieldAttributes field) */
});
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54087178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档