当前位置: 首页 > 知识库问答 >
问题:

用于自定义空值序列化的Jackson自定义注释

慕容宏邈
2023-03-14

根据这个答案: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”。但是方法序列化仅对非空字段调用。

此外,我还尝试调用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));

不应从CreateContextent方法调用。

共有2个答案

焦苏燕
2023-03-14

如果我理解正确,如果值为null,那么您希望将“不适用”写入生成的JSON。

Jackson docs声明value不能为空。这是因为类型参数是Class对象,它是由JVM自动构造的。

根据本文,我认为您可以使用以下内容来处理空字段

public class CustomNullSerializer extends StdSerializer<Object> {

   public CustomNullSerializer() {
        this(null);
   }

   public CustomNullSerializer(Class<Object> t) {
        super(t);
   }

   @Override
   public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeString("N/A");
   }
}

然后将其用于

prov.setNullValueSerializer(new CustomNullSerializer());

我以为我自己没有尝试过,但我希望它能有所帮助。

更新

好吧,现在我有时间自己试试这个。我得到了它的工作

ObjectMapper mapper...
mapper.getSerializerProvider().setNullValueSerializer(new CustomNullSerializer());
鄂和璧
2023-03-14

使用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)将导致: 我该如何实现? 问题答案: 结果:

  • 我试图创建会影响序列化值的自定义jackson注释。 意思是: 现在序列化对象X(10)将导致: 我怎样才能做到这一点?

  • 问题内容: 根据这个答案:http://codingdict.com/questions/137507 我写了这样的序列化器: 如果注释存在且字段为,则女巫应该写字符串“ N / A” 。但是仅对非空字段调用方法。 另外,我尝试致电: 通过这样的实现: 但是没有结果。 如何以这种方式处理空字段? 更新资料 根据讨论:https : //github.com/FasterXML/jackson- d

  • 对于Jackson的序列化,定义自定义bean为空的正确方法是什么? 我想用Json过滤不需要的字段- 目前,如果属于自定义bean的所有变量都为null,我有一个额外的方法将null值分配给它。我在寻找的是,这是否可以由杰克逊来完成。 内容识别类 预期产量 和 电流输出 和

  • 我阅读了Jackson的annotations文档,但是我仍然找不到如何从annotations调用自定义序列化程序来序列化< code>java.sql.Date对象。 但是注释似乎只接受布尔值作为参数,而注释doc则表示: @JsonValue(method):用于标记返回值用作对象序列化的方法;通常用于标记生成字符串的方法(如toString())以生成JSON原语值序列化块引号 我是否使用

  • 我有一个来自DB的结果集,其形式为映射 我为类型为jsonb的PGObject类编写了一个自定义org.postgresql.util.序列化程序,它在