【问题标题】:Prevent custom serialization of specific field防止特定字段的自定义序列化
【发布时间】:2018-06-27 10:14:09
【问题描述】:

假设我有以下课程:

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

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

问题是我想避免在名称(不是值)dateToBeDefaultSerialized 的字段上使用自定义序列化程序,但我似乎找不到这样做的方法。

这就是我的自定义“全局”Date Serializer 的样子:

@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 的属性?

【问题讨论】:

  • 在 Spring Boot 应用程序中,您可以使用属性更改杰克逊日期格式化程序:spring.jackson.date-format=yyyy-MM-dd 然后编写自定义序列化程序以修改“dateToBeDefaultSerialized”字段的行为

标签: java spring-boot serialization jackson


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2013-03-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2014-07-16
    相关资源
    最近更新 更多