2017-03-31 120 views
0

假設我有兩個類:傑克遜:隱藏通過@JsonProperty&@JsonView對超類的子類的屬性

public class Super { 
    @JsonView(SpecialCaseView.class) 
    @JsonProperty("name") 
    public String getDisplayName() { 
     return "super name"; 
    } 
} 

public class Duper extends Super { 
    private String name = "John Smith"; 

    public String getName() { 
     return name; 
    } 
} 

當我做了Duper對象的正常序列(例如,具有new ObjectMapper().writerWithView(ADifferentView.class).writeValueAsString(new Duper())),我希望得到

{ 
    "name": "John Smith" 
} 

相反,我什麼也沒得到。看起來這是因爲超類的「名稱」屬性首先被拾取,但是由於具體的視圖,傑克遜忽略了它。

這是一個錯誤?

如果沒有,有沒有辦法解決這個問題,或者至少有一種方法來檢測它,或得到一個警告?

回答

0

嗯,你正在使用哪個版本的傑克遜?反正,我只是嘗試這樣的代碼(與傑克遜1)

ObjectMapper mapper = new ObjectMapper(); 

String json = mapper.writeValueAsString(new Duper()); 

System.out.println(json); 

如果你把@JsonView的getName()在子類中方法,你會導致

{"name":"super name"} 

得到你想要的。

@JsonView(SpecialCaseView.class) 
public String getName() { 
    return name; 
} 

結果

{"name":"John Smith"} 
+0

傑克遜2.7.3。我應該澄清 - 我正在使用幾種不同的觀點之一進行序列化,並且我希望Duper的「名字」出現在所有這些視圖中。 (理想情況下,無需創建父視圖...) –

+0

我相信只有當您的視圖子類爲SpecialCaseView時(但您顯然不希望這樣),它纔會起作用。 –

+0

對。遊民。謝謝。 –