Jackson将使用原始类型数组反序列化包装类

时间:2018-09-04 08:15:07

标签: java jackson

我有一个如下类,包装字节数组:

public final class Plan {
  private byte[] bytes;
  private int peekIdx;

  public Plan(byte[] bytes, int peekIdx) {
      this.bytes = bytes;
      this.peekIdx = peekIdx;
  }

  public Plan(byte[] bytes) {
      this(bytes, 0);
  }

  //bunch more methods
}

此对象包含在其他对象中,

public final class Agent {
     private Plan plan;
     //bunch more properties...
}

现在我想反序列化JSON之类的

{"plan": [0, 1, 2]}

作为代理。但是,我不知道如何注释Plan来实现这一目标。如果只是byte[]就不会有问题,因为这将直接对应于Agent中的命名属性,可以将其放置为@JsonProperty("plan"),但是我不知何故需要告诉Jackson如何包装数组在Plan对象中。如何实现呢?真的需要自定义序列化程序吗?

2 个答案:

答案 0 :(得分:1)

尝试将@JsonValue放在bytes类的Plan-getter上。它将告诉Jackson,该类仅应使用该值进行序列化。另外,需要按以下方式指定创建者。

赞:

class Plan {


  // ...

  @JsonCreator
  public Plan(byte[] bytes) {
    this(bytes, 0);
  }

  @JsonValue
  public byte[] getBytes() {
      return bytes;
  }

  // ...

}

答案 1 :(得分:0)

您可以使用@JsonCreator注释第二个构造函数,并指定要作为byte数组参数发送的JSON字段的名称:

@JsonCreator
public Plan(@JsonProperty("plan") byte[] bytes) {
    this(bytes, 0);
}

这告诉Jackson使用此构造函数,向其发送JSON对象的plan字段的值。