Как я могу настроить Джексона для получения сериализатора через статический метод 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);

Надеюсь, это поможет!

Другие вопросы по тегам