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;
}
现在我有了想要的输出。
如果没有人找到更好的方法,我很快就会接受这个作为正确答案。
考虑以下示例:
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;
}
现在我有了想要的输出。
如果没有人找到更好的方法,我很快就会接受这个作为正确答案。