[英]Is there a solution about Gson "circular reference"?
我找到了很多关于 Gson 循环引用的文章,但是我找不到优雅的解决方案。
据我所知,一些解决方案是:
但作为一个普遍的问题,是否有一些共同的策略来解决这个问题?
据我所知,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.