如何让杰克逊使用其JsonSerializable接口?

时间:2017-09-01 06:51:25

标签: java json serialization jackson jersey

Jackson docs说,实现 JsonSerializable 接口的类将通过调用Interface的serialize()方法进行序列化。

我在Jersey 2.25下使用Jackson 2.8.4的项目中试过这个。

继续使用Jackson的BeanSerializer基于公共getter进行默认序列化,而不是使用SerializableSerializer和serialize()方法。

代码看起来像这个相当小的例子......

public class Minimal extends JsonSerializable.Base {

  private String title;
  private ZonedDateTime theTime;


  public String getTitle() { return title; }
  void setTitle(String title) { this.title = title; }
  public ZonedDateTime getTheTime() { return theTime; }
  void setTheTime(ZonedDateTime theTime) { this.theTime = theTime; }

  @Override
  public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeStartObject();
    gen.writeFieldName("title");
    gen.writeString(this.title);
    // Other serialization...
    gen.writeEndObject();
  }

  @Override
  public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
    throw new UnsupportedOperationException("Not supported."); 
  }
}

我还尝试了其他想法,使用正确的序列化器...也许是愚蠢的想法,如......

public class Minimal implements JsonSerializable {

@JsonSerialize(using = SerializableSerializer.class)
public class Minimal extends JsonSerializable.Base {

@JsonSerialize(as = JsonSerializable.Base.class)
public class Minimal extends JsonSerializable.Base {

我缺少什么让杰克逊的这个功能有效?

我在Jackson的最新源代码中验证了该功能仍然存在。我想我可以通过调试器中的2.8.4源跟踪它,但也许有人知道答案。

1 个答案:

答案 0 :(得分:0)

显然答案是

  

"我错过了什么?"

Nothing

在写完问题之后,我再次重建了所有内容,重新启动了Tomcat,并重新部署并再次测试并得到了我预期的输出。

因此,我会将其归结为糟糕的构建,错误的部署,混淆的Classloader,类似的东西。我要离开这个问题,因为它提供了一个可以帮助某人的例子。