注解说明
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来实现。