2014-04-14 23 views
0

我想使用Jackson序列化一個JSON對象並使用休眠保存到mysql數據庫中。我的POJO類的所有字段都可以被序列化,除了任何不是原語的字段。使用Jackson的非原語序列化

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,它們與Jackson很好地進行了序列化。

例如,我可以序列一類具有所有這些參數:

public class Map{ 

    private short [][] someMapType; 
    private short [][] someOtherMap; 

    private ArrayList<Mill> someMills, otherMills; 
    private ArrayList<OtherPOJO> myPOJOList; 
    private String action = "myDefaultAction"; 

    ... 
} 

米爾和OtherPOJO是類超過兩陣列和其它原語的多不了多少:純粹的POJO。

它與Jackson和MongoJack(用於MongoDb的jackson序列化程序)都能正常工作。

如果你不能擺脫集合,那麼你必須正確理解什麼是集合中的基本數據結構。 This應該有所幫助,但您可能已經意識到這一點。

解決此結構限制的一種方法是創建非愚蠢的getter和setter。這種方法背後的主要缺點是,每次序列化或反序列化時,都會運行一個循環來遍歷所有元素。這可能會稍微降低性能。

吸氣相當簡單:

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

我趕緊寫,讓我知道,如果有任何錯誤。

我希望它有幫助!

+0

使用第二種方法給我同樣的問題:( – invictvs1

+0

你可以添加你的學生課程的代碼嗎?我會在我的最後嘗試它,你用最新的傑克遜嘗試過嗎? – Johnride

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

這節省了所有學生的名字作爲一個字符串,我能夠很容易地進行序列化和反序列化的領域。