2013-05-08 50 views
0

在任何時間點,我將只設置一個setter方法,但JsonProperty名稱應該相同。當我編譯這個時,我得到一個異常。如何爲兩者設置相同的名稱。?如何使用相同的@jsonproperty名稱int以下示例?

public String getType() { 
    return type; 
} 

@JsonProperty("Json") 
public void setType(String type) { 
    this.type = type; 
} 

public List<TwoDArrayItem> getItems() { 
    return items; 
} 

@JsonProperty("Json") 
public void setItems(List<TwoDArrayItem> items) { 
    this.items = items; 
} 
+0

爲什麼你隱瞞編譯器錯誤的細節?這將是相關的,除非你喜歡猜測遊戲。 – 2013-05-08 05:27:35

+0

那麼你期望傑克遜在任何時候知道要序列化哪一個?畢竟,'null'是一個完美的序列化值。 – 2013-05-08 05:29:20

+0

我得到這個例外。 com.fasterxml.jackson.databind.JsonMappingException:屬性「Json」的getter定義衝突:在兩個setter方法中,一個在時間上是空的。 – Naveen 2013-05-08 05:34:49

回答

1

傑克遜傾向於支持常見場景和良好的設計選擇以支持註釋。

您的情況代表一種非常罕見的情況。你有一個領域在不同的環境中有兩個不同的含義。通常情況下,這不會是一種有利的數據格式,因爲它在另一端爲消費者增加了凌亂的邏輯......他們需要在每種情況下都能夠理解「Json」屬性的含義。如果您只使用了兩個不同的屬性名稱,它對於消費者來說會更清潔。那麼簡單地檢查每個財產的存在就足以知道它獲得了哪個替代方案。

您的Java類似乎設計不佳。類不應該有這種類型的上下文或模式,在一個上下文中允許一個字段,但在另一個上下文中不是。

因爲這主要是與你的設計的味道,而不是串行化的邏輯,最好的辦法可能會糾正你的Java類層次結構:

class BaseClass { 
} 

class SubClassWithItems { 
    public List<TwoDArrayItem> getItems() { 
     return items; 
    } 

    @JsonProperty("Json") 
    public void setItems(List<TwoDArrayItem> items) { 
     this.items = items; 
    } 
} 

class SubClassWithType { 
    public String getType() { 
     return type; 
    } 

    @JsonProperty("Json") 
    public void setType(String type) { 
     this.type = type; 
    } 
} 

這樣,你的類沒有一組不同的字段基於某些運行時狀態。如果運行時狀態正在驅動您的類包含的字段,那麼與僅使用Map相比,這不會更好。

如果你不能改變這一點,你只剩下custom serialization

相關問題