繁体   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