今天在做項目的過程中出現的一個問題,在項目中轉換一個List實體集合,此集合中一個屬性爲另外一個實體的Set集合。在轉換的過程中出現了Json轉換死循環的錯誤。
找了一天找到了兩個解決方案!
第一個解決方案:Google Gson
開始使用的轉換工具不給力,後來在網上找了找,看到Gson之後就做了個例子,發現Gson轉換挺好用的。下面是個小例子
需要引用Gson的jar包(網上搜一下就有很多)
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
import java.util.HashSet;
import java.util.Set;
public class Student {
private int id;
private String name;
private Set<User> users = new HashSet<User>(); //User實體集合
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
import com.google.gson.Gson;
public class test {
public static void main(String[] args) {
Gson gson = new Gson();
User user1 = new User();
user1.setId(1);
user1.setName("xxx");
User user2 = new User();
user2.setId(2);
user2.setName("xxx");
Set<User> users = new HashSet<User>();
users.add(user1);
users.add(user2);
Student student1 = new Student();
student1.setId(1);
student1.setName("xxx");
student1.setUsers(users);
student1.setUser(user1);
Student student2 = new Student();
student2.setId(2);
student2.setName("xxx");
student2.setUsers(users);
student2.setUser(user1);
List<Student> list = new ArrayList<Student>();
list.add(student1);
list.add(student2);
// 帶泛型的list轉化爲json
String s2 = gson.toJson(list);
System.out.println(s2);
}
}
執行結果:
[{"id":1,"name":"xxx","users":[{"id":2,"name":"xxx"},{"id":1,"name":"xxx"}],"user":{"id":1,"name":"xxx"}},{"id":2,"name":"xxx","users":[{"id":2,"name":"xxx"},{"id":1,"name":"xxx"}],"user":{"id":1,"name":"xxx"}}]
第二個解決方案:@JsonIgnore
使用此註解,他的作用是在轉換實體的時候忽略掉加有這個註解的屬性。此方案需要引用Gson的jar包。我們項目底層使用的時Hibernate的註解,在轉換Json的過程中需要忽略掉的一些級聯的屬性集合。
import org.codehaus.jackson.annotate.JsonIgnore;
public class Student {
private int id;
private String name;
@JsonIgnore
private Set<User> users = new HashSet<User>(); //User實體集合
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}