【问题标题】:Jersey/Jackson Serialization of base class only issue基类的泽西/杰克逊序列化仅问题
【发布时间】:2016-05-02 20:23:20
【问题描述】:

考虑以下示例:

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

我希望我的输出只是基类中的字段,但我也得到子字段。 示例的输出是:

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

虽然我希望它只是:

{ "p":2 }

现在我看到了关于我想要的行为和需要的行为的帖子,并且没有看到与我的类似的单个问​​题报告。这对我来说看起来像是错误而不是错误配置。

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

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

编辑:

我尝试过使用其他版本的 jackson,在 2.2.3 和 2.7.0 中的行为是相同的。

【问题讨论】:

    标签: java json serialization jersey jackson


    【解决方案1】:

    您应该在您不想在返回的 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;
    

    【讨论】:

    • 嘿,感谢您的帮助,但第一个解决方案将阻止我返回 c,在某些情况下我需要返回 C 类而不是 P 类。不幸的是,第二种解决方案不起作用,仍然得到相同的输出。
    【解决方案2】:

    所以作为一种临时解决方法,我添加了一个扩展 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;
    }
    

    现在我有了想要的输出。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2015-10-19
      • 2012-06-07
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多