gpt4 book ai didi

java - 用于自定义 NULL 值序列化的 Jackson 自定义注释

转载 作者:搜寻专家 更新时间:2023-10-31 19:52:01 25 4
gpt4 key购买 nike

根据这个答案: https://stackoverflow.com/a/43342675/5810648

我写了这样的序列化器:

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);
}
}

如果注释存在且字段为 null,Witch 应该写入字符串“N/A”。但方法 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;
}
}

其中@NAifNullCustomNullSerializer定义如下:

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());
}
});

关于java - 用于自定义 NULL 值序列化的 Jackson 自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50746384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com