防止特定字段的自定义序列化

时间:2018-01-18 10:55:17

标签: java spring-boot serialization jackson

假设我有以下课程:

class MyClass {
    private Date dateToBeCustomeSerialized;
    private Date dateToBeDefaultSerialized;
}

在我的Spring Boot应用程序中,我需要将每个Date对象序列化为String。出于这个目的,为了避免在任何地方插入@JsonSerializer,我在应用程序级别引入了自定义Serializer。

问题是我想避免在名称(而不是值)dateToBeDefaultSerialized的字段上使用自定义序列化程序,而我似乎无法找到实现此目的的方法。

这是我的自定义“全局”Date序列化程序的样子:

@Bean
@Primary
public ObjectMapper serializingObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(Date.class, new DateSerializer());
    objectMapper.registerModule(module);

    return objectMapper;
}

public class DateSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(value);
        gen.writeString(date);
    }
}

是否有使用默认序列化程序序列化名称dateToBeDefaultSerialized的属性?

1 个答案:

答案 0 :(得分:1)

通过实施ContextualSerializer,可以获取当前序列化字段的名称。默认序列化可通过SerializerProvider获得。尝试重写序列化器,如下所示:

class DateSerializer extends JsonSerializer<Date> implements ContextualSerializer {
    private boolean doCustom;

    DateSerializer() {}

    private DateSerializer(boolean doCustom) { this.doCustom = doCustom; }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (doCustom) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String date = sdf.format(value);
            gen.writeString(date);
        } else {
            provider.defaultSerializeDateValue(value, gen);
        }
    }

    @Override
    public JsonSerializer<Date> createContextual(SerializerProvider config, BeanProperty property) {
        boolean doCustom = property == null || !"dateToBeDefaultSerialized".equals(property.getName());
        return new DateSerializer(doCustom);
    }
}