@JsonSerialize注解使用总结

3,653 阅读1分钟

注解说明

jackson注解,用于对象序列化为json时,对注解的属性进行格式化输出;

使用场景案例

1、开发中应产品要求,需要将Double类型的数值保留4位小数,以及百分数需要保留两位小数。后又应前端小姐姐要求,Double类型的null值,希望改为空字符串输出。查找了多种方案,最终选择用@JsonSerialize注解实现;

代码:

(1)继承JsonSerializer,自定义序列化输出方法

Double类型非null值保留四位小数和计算百分数保留两位小数输出:

/**
 * Double类型保留四位小数,输出String
 */
public class CustomDoubleSerialize extends JsonSerializer<Double> {
    private static final DecimalFormat df = new DecimalFormat("#.####");

    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        //四舍五入
        df.setRoundingMode(RoundingMode.HALF_UP);
        //输出String,如果想直接输出数字,使用gen.writeNumber();
        gen.writeString(df.format(value));
    }
}

/**
 * Double类型返回百分数,并保留两位小数
 */
public class CustomPercentDoubleSerialize extends JsonSerializer<Double> {
    private static final DecimalFormat df = new DecimalFormat("#.##");

    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        df.setRoundingMode(RoundingMode.HALF_UP);
        gen.writeString(df.format(value * 100));
    }
}

任意类型null值改为空字符串输出:

public class NullNumberSerialize extends JsonSerializer<Object> {

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

(2)注解使用

Double属性,数值转为百分数,null替换为空字符串输出

@Data
public class RetentionRate {
    @JsonSerialize(using = CustomPercentDoubleSerialize.class, nullsUsing = NullNumberSerialize.class)
    private Double model;
    @JsonSerialize(using = CustomPercentDoubleSerialize.class, nullsUsing = NullNumberSerialize.class)
    private Double business;
    private Integer day;
}

注意:using只能用于非空属性值的序列化转换,值为null时不生效,需要使用nullsUsing来实现。