用于Optional <?>的Jackson自定义序列化程序

时间:2019-12-13 18:00:06

标签: java json jackson

说我有一个简单的String自定义序列化器和反序列化器。

public class SimpleSerializer extends StdSerializer<String> {

  protected SimpleSerializer() {
    super(String.class);
  }

  @Override
  public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException {
    if (value == null) {
      return;
    }

    value = doThings(value);
    gen.writeString(value);
  }
}

我在各种String字段上都使用了它,但现在我也需要在Optional<String>字段上使用它。

@JsonSerialize(using = SimpleSerializer.class)
@JsonDeserialize(using = SimpleDeserializer.class)
private Optional<String> item;

不幸的是,由于班级不匹配,这无法正常工作。而且我无法像Optional<@JsonSerialize... String> item那样分配它,因为注释未标有TYPE_USE目标。我尝试使用TYPE_USE@JacksonAnnotationsInside和其他选项创建自定义注释,这是一种变通方法,但这都不起作用,这不足为奇。

有什么方法可以使用序列化程序和反序列化程序,而无需专门为Optional<String>创建另一个序列化程序?

1 个答案:

答案 0 :(得分:2)

首先,将杰克逊Module包括在Optional中。它是

的一部分
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>${jackson.version}</version>
</dependency>

第二,用您的ObjectMapper

注册
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());

最后,用@JsonSerialize@JsonDeserialize注释字段,但使用它们的contentUsing元素指定自定义序列化器/反序列化器

@JsonSerialize(contentUsing = SimpleSerializer.class)
@JsonDeserialize(contentUsing = SimpleDeserializer.class)

用于序列化JsonSerializer字段的Optional OptionalSerializer将知道委托给SimpleSerializer来执行实际的序列化。同样的行为也适用于反序列化。