我将 Jackson 与 Jersey + Jetty 一起用于我的 RESTful 应用程序。 Jackson 库是:jackson-annoations-2.8.0
、jackson-core-2.8.9
和 jackson-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/