Как я могу настроить Джексона для получения сериализатора через статический метод getInstance()?
Давайте представим, что у меня есть собственный сериализатор, определенный так;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonStreamContext;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
@SingletonSerializer // my custom annotation
public final class ThumbnailUrlSerializer extends JsonSerializer {
private static final ThumbnailUrlSerializer INSTANCE = new ThumbnailUrlSerializer();
public static ThumbnailUrlSerializer getInstance() {
return INSTANCE;
}
private ThumbnailUrlSerializer() {
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
final JsonStreamContext context = gen.getOutputContext();
if ("thumbnailUrl".equals(context.getCurrentName()) && value == null) {
gen.writeStringField(context.getCurrentName(), "FOO");
} else {
gen.writeStringField(context.getCurrentName(), (String) value);
}
}
}
Поле аннотировано для использования этого сериализатора:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class Product {
private String primaryKey;
@JsonSerialize(using = ThumbnailUrlSerializer.class)
private String thumbnailUrl;
public String getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(String primaryKey) {
this.primaryKey = primaryKey;
}
public String getThumbnailUrl() {
return thumbnailUrl;
}
public void setThumbnailUrl(String thumbnailUrl) {
this.thumbnailUrl = thumbnailUrl;
}
}
Я думаю, что с помощью кастома com.fasterxml.jackson.databind.ObjectMapper#setSerializerProvider
или же com.fasterxml.jackson.databind.ObjectMapper#setSerializerFactory
это можно сделать, но я не уверен, как это сделать.
Любые идеи, как я могу это сделать?
1 ответ
Пользовательский сериализатор:
public class ThumbnailUrlSerializer extends StdSerializer<Product> {
private ThumbnailUrlSerializer(Class<Product> t) {
super(t);
}
private static final ThumbnailUrlSerializer INSTANCE = new ThumbnailUrlSerializer(Product.class);
public static ThumbnailUrlSerializer getInstance() {
return INSTANCE;
}
@Override
public void serialize(Product product, JsonGenerator gen, SerializerProvider sp) throws IOException {
final JsonStreamContext context = gen.getOutputContext();
if ("thumbnailUrl".equals(context.getCurrentName()) && product == null) {
gen.writeStringField(context.getCurrentName(), "FOO");
} else {
gen.writeStringField(context.getCurrentName(), (String) product.getThumbnailUrl());
}
}
}
Использование:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Product.class, ThumbnailUrlSerializer.getInstance()); // singleton usage
mapper.registerModule(module);
String json = mapper.writeValueAsString(product);
System.out.println("output "+json);
Надеюсь, это поможет!