gpt4 book ai didi

java - Jackson 序列化继承和方法重载问题

转载 作者:行者123 更新时间:2023-12-01 18:37:48 24 4
gpt4 key购买 nike

我将 Jackson 与 Jersey + Jetty 一起用于我的 RESTful 应用程序。 Jackson 库是:jackson-annoations-2.8.0jackson-core-2.8.9jackson-databind-2.8.9

我无法让 Jackson 输出子类的值。它总是输出继承类的值。尽管我明确提供了具体的对象。这个场景有点难以正确表达,我希望下面的例子能更好地解释它。

这是序列化的类的伪代码:

  • Parent0.java:

    class Parent0 {
    protected Child0 child;

    public Parent0() {}

    public Child0 getChild() {
    return child;
    }

    public void setChild(Child0 child) {
    this.child = child;
    }
    }
  • Parent1.java:

    class Parent1 extends Parent0 {}
  • Child0.java:

    class Child0 {
    protected int id;

    public Child0() {}

    public void setId(int id) {
    this.id = id;
    }

    public int getId() {
    return this.id;
    }

    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Child0 child0 = (Child0) o;
    return id == child0.id;
    }

    @Override
    public int hashCode() {
    return Objects.hash(id);
    }
    }
  • Child1.java:

    class Child1 extends Child0 {
    private String childName;

    public Child1() {}

    public String getChildName() {
    return childName;
    }

    public void setChildName(String childName) {
    this.childName = childName;
    }
    }
  • 主 Controller 内部:

    Parent0 p0 = new Parent0();
    Child0 c0 = new Child0();
    c0.setId(0);
    p0.setChild(c0);

    Parent0 p1 = new Parent1();
    Child1 c1 = new Child1();
    c1.setId(1);
    c1.setChildName("C1");
    p1.setChild(c1);

    serializeAndPrint(p0); // #1
    serializeAndPrint(p1); // #2

输出:

    #1 Parent0.json
{
child: {
id: 0
}
}

#2 Parent1.json
{
child: {
id: 1
}
}

预期:

    #2 Parent1.json
{
child: {
id: 1,
childName: "C1"
}
}

序列化由 Jersey 框架处理。我用 @Produces(MediaType.APPLICATION_JSON) 注释我的端点,它基本上负责转换。

最佳答案

你的serializeAndPrint方法的实现是什么?
我编写了一个单元测试来重现该问题:

public class JsonTest {

@Test
public void test() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();

Parent0 p0 = new Parent0();
Child0 c0 = new Child0();
c0.setId(0);
p0.setChild(c0);

Parent0 p1 = new Parent1();
Child1 c1 = new Child1();
c1.setId(1);
c1.setChildName("C1");
p1.setChild(c1);

System.out.println(mapper.writer(new DefaultPrettyPrinter()).writeValueAsString(p0));
System.out.println(mapper.writer(new DefaultPrettyPrinter()).writeValueAsString(p1));

}

}

输出正是您所期望的:

{
"child" : {
"id" : 0
}
}
{
"child" : {
"id" : 1,
"childName" : "C1"
}
}

关于java - Jackson 序列化继承和方法重载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60001962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com