【问题标题】:Serialization of non-primitives using Jackson使用 Jackson 对非基元进行序列化
【发布时间】:2014-05-28 19:23:01
【问题描述】:

我正在尝试使用 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 从树中读取。

【问题讨论】:

  • 您可以使用反向引用。

标签: java mysql hibernate serialization jackson


【解决方案1】:

找到了一个不错的解决方法:

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

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

【讨论】:

    【解决方案2】:

    解决这个问题的一种方法是使用纯数组或数组列表,它们可以用 Jackson 很好地序列化。

    例如,我可以用所有这些参数序列化一个类:

    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。这种方法的主要缺点是,每次序列化或反序列化时,都要对所有元素再运行一个 for 循环。这可能会稍微降低性能。

    getter 相当简单:

    public Student[] getStudents(){
        return this.students.toArray();
    }
    

    setter 也很简单:

    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]);
        }
    }
    

    我写得很快,如果有任何错误请告诉我。

    希望对你有帮助!

    【讨论】:

    • 使用第二种方法给我同样的问题:(
    • 你能添加你的学生类的代码吗?我会在我的最后尝试。你用最新的杰克逊试过了吗?
    猜你喜欢
    • 2014-07-27
    • 2021-12-13
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多