我正在尝试使用Jackson序列化JSON对象并使用hibernate保存到mysql数据库中。除了任何不是原语的字段外,我的POJO类的所有字段都能够被序列化。
public class Teacher {
private Set<Student> students;
private int id;
// getters and setters
}
在这种情况下,它会对学生失败,通过参考链创建无限的递归循环。我可以用@JsonIgnoreProperty
来阻止它,但我希望这个字段被序列化。我像这样序列化我的对象:
ObjectMapper mapper = new ObjectMapper();
Teacher myTeacher = new Teacher();
mapper.writeValueAsString(teacher);
我能想到的唯一解决方法是在教师的末尾附加一个字符串,同时仍然忽略该属性,但我不确定如果我这样做,我是否能够从树中读取学生作为JsonNode。
答案 0 :(得分:0)
解决这个问题的方法是使用一个纯数组或一个与杰克逊序列化的ArrayList。
例如,我可以使用所有这些参数序列化一个类:
public class Map{
private short [][] someMapType;
private short [][] someOtherMap;
private ArrayList<Mill> someMills, otherMills;
private ArrayList<OtherPOJO> myPOJOList;
private String action = "myDefaultAction";
...
}
Mill和OtherPOJO只有几个数组和其他基元的类别:纯POJO。
它与Jackson和MongoJack(MongoDb的杰克逊序列化器)两种方式都很好。
如果你不能远离集合,那么你必须正确理解集合中的基本数据结构。 This应该有所帮助,但您可能已经意识到这一点。
解决此结构限制的方法是创建非哑的getter和setter。这种方法背后的主要缺点是,每次序列化或反序列化时,都会在所有元素上再循环一次。这可能会略微降低性能。
getter非常简单:
public Student[] getStudents(){
return this.students.toArray();
}
而且制定者也非常简单:
public void setStudents(Student[] students){
this.students = new Set<Student>(); // Or anything that builds the right Set for you
for(int i = 0; i < students.length; i++){
this.students.add(students[i]);
}
}
我写得很快,如果有任何错误,请告诉我。
我希望它有所帮助!
答案 1 :(得分:0)
找到一个不错的解决方法:
@JsonIgnore
public Set<Student> getStudents() {
return students;
}
@JsonProperty("Students")
public String getStudentsForJson() {
String[] studentNames = new String[this.students.size()];
int i = 0;
for(Student student : this.students) {
studentNames[i] = student.getName();
i++;
}
return StringUtils.join(studentNames, ", ");
}
这会将所有学生姓名保存为一个字符串,我可以轻松地将其序列化并反序列化为字段。