如果使用 GSON 将 Java 类转换为 JSON 可以避免导致循环引用和不定式循环的字段,只需将注解 @Expose 放在要出现在 JSON 中的字段中,并且没有注解 @Expose 的字段不会出现在 JSON 中。
循环引用例如如果我们尝试用类Route的字段路由序列化类User,并且类Route有类User的字段user,那么GSON尝试序列化类User并且当尝试序列化路由,序列化类 Route 并在类 Route 尝试序列化字段 user,并再次尝试序列化类 User,有一个循环引用会引发不定式循环。我展示了提到的类 User 和 Route。
import com.google.gson.annotations.Expose;
类用户
@Entity
@Table(name = "user")
public class User {
@Column(name = "name", nullable = false)
@Expose
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
@OnDelete(action = OnDeleteAction.CASCADE)
private Set<Route> routes;
@ManyToMany(fetch = FetchType.EAGER)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinTable(name = "like_", joinColumns = @JoinColumn(name = "id_user"),
inverseJoinColumns = @JoinColumn(name = "id_route"),
foreignKey = @ForeignKey(name = ""),
inverseForeignKey = @ForeignKey(name = ""))
private Set<Route> likes;
班级路线
@Entity
@Table(name = "route")
public class Route {
@ManyToOne()
@JoinColumn(nullable = false, name = "id_user", foreignKey =
@ForeignKey(name = "c"))
private User user;
为了避免不定式循环,我们使用提供 GSON 的注释 @Expose。
我以 JSON 格式显示使用 GSON 对 User 类进行序列化的结果。
{
"name": "ignacio"
}
我们可以看到JSON格式中不存在字段路由和点赞,只有字段名。因此,避免了循环引用。
如果我们想使用它,我们必须以特定方式创建一个对象 GSON。
Gson converterJavaToJson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
最后,我们使用创建的conversor GSON转换hibernate用户模型的java类。
User user = createUserWithHibernate();
String json = converterJavaToJson.toJson(user);