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

标签 java json serialization jackson jersey

我将 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/

相关文章:

java - JScrollPane 格式化以显示 Pascals 三角形

java - 使用 ArrayList 的优先级队列的性能

java - 不可见的组件仍然占用空间 JPanel

c# - 无法将类型 'System.Web.Mvc.RedirectToRouteResult' 隐式转换为 'System.Web.Mvc.JsonResult'

mysql - 如何在 MySQL 中编写可以解析列中 JSON 数据的查询?

javascript - 当没有键时如何访问嵌套的 json 值?

java - 改变多维ArrayList的值

java - 如何序列化 lambda?

c# - 对象到网络序列化 - 使用现有协议(protocol)

c++ - SFINAE 序列化共享指针失败