【问题标题】:How to get Jackson to use its JsonSerializable Interface?如何让杰克逊使用它的 JsonSerializable 接口?
【发布时间】:2018-02-10 04:38:46
【问题描述】:

Jackson 文档说,实现其 JsonSerializable 接口的类将通过调用接口的 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 功能正常工作,我缺少什么?

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

【问题讨论】:

    标签: java json serialization jackson jersey


    【解决方案1】:

    显然是答案

    “我错过了什么?”

    什么都没有

    写完问题后,我重新构建了一切,重新启动了Tomcat,重新部署并再次测试,得到了我预期的输出。

    所以我将把它归结为糟糕的构建、糟糕的部署、混乱的 Classloader 等等。我将留下这个问题,因为它提供了一个可能对某人有所帮助的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2018-11-01
      • 2014-10-12
      • 2019-10-25
      相关资源
      最近更新 更多