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