根据这个答案:http://codingdict.com/questions/137507
我写了这样的序列化器:
public class CustomSerializer extends StdSerializer<Double> implements ContextualSerializer {
private final NAifNull annotation;
public CustomSerializer() {
super(Double.class);
this.annotation = null;
}
public CustomSerializer(NAifNull annotation) {
super(Double.class);
this.annotation = annotation;
}
@Override
public void serialize(Double value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (annotation != null && value == null) {
gen.writeString("N/A");
} else {
gen.writeNumber(value);
}
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
NAifNull annotation = property.getAnnotation(NAifNull.class);
return new CustomSerializer(annotation);
}
}
如果注释存在且字段为,则女巫应该写字符串“ N / A” null
。但是serialize
仅对非空字段调用方法。
另外,我尝试致电setNullValueSerializer
:
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
NAifNull annotation = property.getAnnotation(NAifNull.class);
prov.setNullValueSerializer(new CustomNullSerializer(annotation));
return new CustomSerializer(annotation);
}
通过这样的实现:
private static class CustomNullSerializer extends JsonSerializer<Object> {
private final NAifNull annotation;
public CustomNullSerializer(NAifNull annotation) {
this.annotation = annotation;
}
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (annotation != null) {
gen.writeString("N/A");
} else {
gen.writeNull();
}
}
}
但是没有结果。
如何以这种方式处理空字段?
更新资料
根据讨论:https :
//github.com/FasterXML/jackson-
databind/issues/2057
prov.setNullValueSerializer(new CustomNullSerializer(annotation));
不应该从CreateContextual
方法中调用。
使用BeanSerializerModifier
为
特定属性 自定义空序列化器:
public class CustomBeanSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
for (BeanPropertyWriter beanProperty : beanProperties) {
if (beanProperty.getAnnotation(NAifNull.class) != null) {
beanProperty.assignNullSerializer(new CustomNullSerializer());
}
}
return beanProperties;
}
}
其中@NAifNull
和CustomNullSerializer
定义如下:
public class CustomNullSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object value, JsonGenerator jgen,
SerializerProvider provider) throws IOException {
jgen.writeString("N/A");
}
}
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@interface NAifNull {
}
然后按以下方式使用它:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimpleModule() {
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.addBeanSerializerModifier(new CustomBeanSerializerModifier());
}
});
问题内容: 我正在尝试创建将影响序列化值的自定义杰克逊注释。 含义: 现在序列化对象X(10)将导致: 我该如何实现? 问题答案: 结果:
根据这个答案:https://stackoverflow.com/a/43342675/5810648 我编写了这样的序列化程序: 如果注释存在并且字段为,则Witch应该编写字符串“N/A”。但是方法仅对非空字段调用。 此外,我还尝试调用setNullValueSerializer: 有了这样的实施: 但没有结果。 如何以这种方式处理空字段? 使现代化 根据讨论:https://github.c
我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?
下面的代码再现了这个问题: 上面的代码不做其他注册“自定义”序列化程序的事情(只是委托回原始序列化程序),但它生成的JSON没有null属性: {“第一个”:“鲍勃”,“最后一个”:“巴克”} 我读过许多看似相关的SO文章,但没有一篇能让我找到解决方案。我尝试在序列化时显式地将映射器设置为,但没有成功。 我唯一的线索是JavaDoc for JsonSerializer中的一条注释: 注意:永远不
我有一个来自DB的结果集,其形式为映射 我为类型为jsonb的PGObject类编写了一个自定义org.postgresql.util.序列化程序,它在
对于Jackson的序列化,定义自定义bean为空的正确方法是什么? 我想用Json过滤不需要的字段- 目前,如果属于自定义bean的所有变量都为null,我有一个额外的方法将null值分配给它。我在寻找的是,这是否可以由杰克逊来完成。 内容识别类 预期产量 和 电流输出 和