2013-01-21 31 views
10

在傑克遜,可以在POJO上使用JsonSerialize註釋以防止空對象被序列化(@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL))。但是,原始元素不能設置爲null,所以此註釋對於像int沒有被觸及並且默認爲0的東西不起作用。我如何使傑克遜不使用默認值序列化基元

是否有一個註釋允許我說「對於這個類,不要序列化原語,除非它們與默認值不同「或者」對於這個字段,如果它的值是X,不要序列化它「?

+0

你有沒有考慮使用自定義序列?不知道它是如何與原語一起工作的,但至少要看看它。 – atomman

+0

這是我希望不會聽到的答案=)。到目前爲止,到目前爲止,所有的工作都非常成功,包括香草設置和JsonProperty,JsonIgnore和JsonFilter註釋。 雖然我會檢查出來,謝謝。 – galactoise

回答

20

如果」重新使用最近版本的傑克遜,你可以使用JsonInclude.Include.NON_DEFAULT這應該適用於基元。

對這個缺點的方法是,一個bean屬性設置爲默認值不會有任何效果和性能仍然不會被包括:

@JsonInclude(Include.NON_DEFAULT) 
public class Bean { 
    private int val; 
    public int getVal() { return val; } 
    public void setVal(int val) { this.val = val; } 
} 

Bean b = new Bean(); 
b.setVal(0); 
new ObjectMapper().writeValueAsString(b); // "{}" 
+0

這就是我一直在尋找的!我的版本需要多長時間? – galactoise

+0

檢查你的'JsonSerialize.Inclusion'或'JsonInclude.Include'(如果使用Jackson 2.x)枚舉'NON_DEFAULT'選項,它看起來好像比我想象的要長 – HiJon89

3

事實上,在Java中,類加載器將設置爲所有未初始化的基本屬性(int = 0,boolean = false等)的默認值,因此您無法區分它們與由你的應用。在我看來,你有兩個選擇:

  • 使用相應的包裝對象,而不是原語(整型,布爾型,長..)
  • 前面已經提出,定義自定義序列