作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为 isEmpty 方法添加自定义行为。
当我从 JsonSerializer<MySpecificClass>
延伸时
我应该覆盖序列化方法,因为它是抽象的。
我想保留序列化方法,只覆盖 isEmpty 方法。
最佳答案
为了修改 isEmpty
行为但保持默认序列化,您可以利用 serializer 修饰符。您仍然需要实现自定义序列化程序,但您可以非常干净地利用默认序列化。
将 defaultSerializer
变量注入(inject)到您的自定义序列化程序类中。当我们实现修饰符时,你会看到这个序列化器是从哪里来的。在此类中,您将覆盖 isEmpty
方法来完成您需要的操作。下面,如果 MySpecificClass
有一个空的 id
它被 Jackson 认为是空的。
public class MySpecificClassSerializer extends JsonSerializer<MySpecificClass> {
private final JsonSerializer<Object> defaultSerializer;
public MySpecificClassSerializer(JsonSerializer<Object> defaultSerializer) {
this.defaultSerializer = checkNotNull(defaultSerializer);
}
@Override
public void serialize(MySpecificClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
defaultSerializer.serialize(value, gen, serializers);
}
@Override
public boolean isEmpty(SerializerProvider provider, MySpecificClass value) {
return value.id == null;
}
}
BeanSerializerModifier
扩展 BeanSerializerModifier
并覆盖 modifySerializer
方法。在此方法中,您可以筛选要操作的类类型,并相应地返回您的自定义序列化程序。
public class MyClassSerializerModifier extends BeanSerializerModifier {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
if (beanDesc.getBeanClass() == MySpecificClass.class) {
return new MySpecificClassSerializer((JsonSerializer<Object>) serializer);
}
return serializer;
}
}
ObjectMapper
注册修饰符注册修饰符将允许您的序列化程序在满足 modifySerializer
中的条件时触发。
ObjectMapper om = new ObjectMapper()
.registerModule(new SimpleModule()
.setSerializerModifier(new MyClassSerializerModifier()));
关于java - 如何在不覆盖序列化方法的情况下为特定类覆盖 JsonSerializer 的 isEmpty 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31025046/
我是一名优秀的程序员,十分优秀!