说我有一个简单的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>
创建另一个序列化程序?
答案 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
来执行实际的序列化。同样的行为也适用于反序列化。