[英]Jersey/Jackson Serialization of base class only issue
考慮以下示例:
class P {
int p = 0;
public int getP() { return p; }
public void setP(int p) { this.p = p; }
}
class C extends P {
int c = 0;
public int getC() { return c; }
public void setC(int c) { this.c = c; }
}
@GET
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
public P testIt() {
C c = new C();
c.setP(2);
P p = c;
//p.setC(3) or p.getC() would produce error, expectedly
return p;
}
我希望輸出的只是基類中的字段,但是我也得到childs字段。 示例的輸出為:
{ "p":2, "c":0 }
而我希望它只是:
{ "p":2 }
現在,我已經看到有關我想要的行為和具有我需要的行為的帖子,並且沒有看到單個問題的報告與我的相似。 在我看來,這似乎是錯誤而不是錯誤的配置。
有什么想法我可能做錯了什么或有什么建議嗎? 如果有人需要一些相關信息,請詢問。 提前致謝!
我的球衣版本是2.22.1。 我的傑克遜版本是2.5.4。
編輯:
我試過使用其他版本的傑克遜,在2.2.3和2.7.0中,行為是相同的。
您應該在不想在返回的JSON中看到的字段getter上使用注釋@JsonIgnore
class C extends P {
int c = 0;
@JsonIgnore
public int getC() { return c; }
public void setC(int c) { this.c = c; }
}
否則,嘗試將C類轉換為P
P p = (P) c;
因此,作為臨時的解決方法,我添加了一個擴展P的類:
class G extends P {
public G(P p) {super(p);}
}
並將復制構造函數添加到父類P:
public P(P p) {this.p = p.getP();}
並在代碼中以以下方式使用了它:
public G testIt() {
C c = new C();
c.setP(2);
P p = c;
G g = new G(p);
return g;
}
現在我有想要的輸出。
如果沒有人找到更好的方法,我將很快接受此方法作為正確答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.