當使用Jackson(fasterxml.jackson 2.1.1)時,是否有一種內置的方法來只序列化孩子的ID?我們想通過有Person
參考的REST發送Order
。然而,person對象非常複雜,我們可以在服務器端刷新它,所以我們需要的只是主鍵。如何僅用傑克遜序列化一個孩子的ID
或者我需要一個自定義序列化器嗎?或者我需要@JsonIgnore
所有其他屬性?當請求Order
對象時會阻止Person
數據被髮送回去嗎?我不知道如果我需要這個,但我想盡可能控制它...
當使用Jackson(fasterxml.jackson 2.1.1)時,是否有一種內置的方法來只序列化孩子的ID?我們想通過有Person
參考的REST發送Order
。然而,person對象非常複雜,我們可以在服務器端刷新它,所以我們需要的只是主鍵。如何僅用傑克遜序列化一個孩子的ID
或者我需要一個自定義序列化器嗎?或者我需要@JsonIgnore
所有其他屬性?當請求Order
對象時會阻止Person
數據被髮送回去嗎?我不知道如果我需要這個,但我想盡可能控制它...
有幾種方法。第一種是使用@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。
這真的很有用。謝謝。 當你使用@JsonIdentityReference(alwaysAsId = true)時,Jackson不能反序列化它,對嗎? 是否可以通過編寫自定義串行器/解串器來實現相同的功能? – miguelcobain
正確 - 如果沒有對象ID匹配,傑克遜無法弄清楚;所以通常這個選項對於僅用於序列化的用例來說是有意義的(如果需要的話,其他的可以將它重新組合在一起)。自定義(de)序列化器可以做任何你想做的事情,所以理論上是的。 – StaxMan
@StaxMan可以請你告訴我如何使用'@JsonIdentityReference(alwaysAsId = true',但是我想得到包裹在Object中的結果不是作爲一個普通的屬性。 – Waqas
請問這有幫助嗎? http://stackoverflow.com/questions/8179986/jackson-change-jsonignore-dynamically – Omertron