2013-07-09 39 views
40

當使用Jackson(fasterxml.jackson 2.1.1)時,是否有一種內置的方法來只序列化孩子的ID?我們想通過有Person參考的REST發送Order。然而,person對象非常複雜,我們可以在服務器端刷新它,所以我們需要的只是主鍵。如何僅用傑克遜序列化一個孩子的ID

或者我需要一個自定義序列化器嗎?或者我需要@JsonIgnore所有其他屬性?當請求Order對象時會阻止Person數據被髮送回去嗎?我不知道如果我需要這個,但我想盡可能控制它...

+0

請問這有幫助嗎? http://stackoverflow.com/questions/8179986/jackson-change-jsonignore-dynamically – Omertron

回答

87

有幾種方法。第一種是使用@JsonIgnoreProperties從子刪除屬性,就像這樣:

public class Parent { 
    @JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has 
    public Child child; // or use for getter or setter 
} 

另一種可能性,如果子對象始終序列化爲ID:

public class Child { 
    // use value of this property _instead_ of object 
    @JsonValue 
    public int id; 
} 

還有一個方法是使用@JsonIdentityInfo

public class Parent { 
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
    @JsonIdentityReference(alwaysAsId=true) // otherwise first ref as POJO, others as id 
    public Child child; // or use for getter or setter 

    // if using 'PropertyGenerator', need to have id as property -- not the only choice 
    public int id; 
} 

這也可以用於序列化,並忽略id以外的屬性。但是結果不會被封裝爲Object。

+0

這真的很有用。謝謝。 當你使用@JsonIdentityReference(alwaysAsId = true)時,Jackson不能反序列化它,對嗎? 是否可以通過編寫自定義串行器/解串器來實現相同的功能? – miguelcobain

+1

正確 - 如果沒有對象ID匹配,傑克遜無法弄清楚;所以通常這個選項對於僅用於序列化的用例來說是有意義的(如果需要的話,其他的可以將它重新組合在一起)。自定義(de)序列化器可以做任何你想做的事情,所以理論上是的。 – StaxMan

+1

@StaxMan可以請你告訴我如何使用'@JsonIdentityReference(alwaysAsId = true',但是我想得到包裹在Object中的結果不是作爲一個普通的屬性。 – Waqas