繁体   English   中英

是否有关于 Gson“循环引用”的解决方案?

[英]Is there a solution about Gson "circular reference"?

我找到了很多关于 Gson 循环引用的文章,但是我找不到优雅的解决方案。

据我所知,一些解决方案是:

  • 将导致循环引用的属性设置为“transient”。
  • 用一些注释排除属性。

但作为一个普遍的问题,是否有一些共同的策略来解决这个问题?

据我所知,Gson 中没有针对循环引用的自动化解决方案。 我所知道的唯一一个自动处理循环引用的 JSON 生成库是XStream (带有 Jettison 后端)。

编辑:Jackson 还支持使用@JsonIdentityInfo注释处理循环引用; 因此,虽然不是自动的(您确实需要标记需要处理对象 ID 的引用),但它确实可以解决大多数情况。

由于 Gson 不能正确处理循环引用,并且在某些情况下您可能需要从其子实体调用父实体,您可以这样做。 假设我们有:

@Entity
@Table(name = "servers_postgres")
public class PostgresServer implements Serializable {

    public PostgresServer() {
        this.tables = new ArrayList<>();
    }

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_server")
    private Integer serverId;

    @OneToMany(orphanRemoval = true, mappedBy = "server", fetch = FetchType.EAGER)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List<PostgresTable> tables;

    @Column(length = 250)
    private String serverAddress;

    @Column(length = 250)
    private String name;
}

@Entity
@Table(name = "postgres_tables")
    public class PostgresTable implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_table")
        private Integer tableId;

        @Column(length = 250)
        private String name;

        @ManyToOne()
        @JoinColumn(name = "id_server", foreignKey = @ForeignKey(name = "fk_postgres_tables"))
        private PostgresServer server;
    }

在这种情况下,您可能需要从 PostgresTable 实体获取 PostgresServer 引用。 因此,您无需将PostgresServer从序列化中排除,而只需将其 List of tables 设置为 null 例如:

//Assuming a List<PostgresTable>...
postgresTables.forEach(postgresTable -> postgresTable.getServer().setTables(null));

这就是我用 Gson 解决循环引用的方法。 希望能帮助某人。

我也在研究这个问题。 Gson 目前没有提供默认的解决方案。 你可以做的是:

选项 1:创建一个排除策略,该策略实现 ExclusionStrategy 以排除循环引用中的类和/或字段;

方案二:使用注解将字段标记为transient,避免序列化;

选项 3:创建您自己的类型适配器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM