使用Jackson序列化非基元

时间:2014-04-14 17:49:16

标签: java mysql hibernate serialization jackson

我正在尝试使用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。

2 个答案:

答案 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, ", ");
}

这会将所有学生姓名保存为一个字符串,我可以轻松地将其序列化并反序列化为字段。