Jersey/Jackson 基础序列化 class 唯一问题

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;
}

我希望我的输出只是来自基础 class 的字段,但我也得到子字段。 示例的输出是:

{ "p":2, "c":0 }

虽然我希望它只是:

{ "p":2 }

现在我已经看到关于 SO wanting behavior I have and having the behavior I need 的帖子,但没有看到与我类似的单一问题报告。对我来说,这看起来像是错误而不是配置错误。

有什么想法我可能做错了什么或有什么建议吗?如果有人需要一些相关信息,请直接询问。提前致谢!

我的球衣版本是2.22.1。 我的杰克逊版本是 2.5.4.

编辑:

我试过使用其他版本的 jackson,在 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 class 转换为 P

P p = (P) c;

因此,作为临时解决方法,我又添加了一个 class 扩展 P:

class G extends P {
    public G(P p) {super(p);}
}

并将复制构造函数添加到 Parent class 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;
}

现在我有了想要的输出。

如果没有人找到更好的方法,我很快就会接受这个作为正确答案。