簡體   English   中英

僅基類的Jersey / Jackson序列化問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM