JSON 是数据交换的通用格式
@JsonSerialize注解是Jackson 库中的一部分,用于定义在将 Java 对象序列化为 JSON 格式时,如何进行定制化处理的方式。Jackson 是一个流行的 Java 库,用于处理 JSON 数据的序列化和反序列化。可以在字段、方法或者类级上自定义序列化类。有using
属性,允许指定一个自定义的序列化器(Serializer)类,来决定如何将 Java 对象转换为 JSON 数据。
用来自定义需要转换为JSON数据,可以用在类上,自定义对这个类的JSON处理,也可以用在字段上自定义对字段的处理,例如日期格式、小数点保留几位,是否准换为1或0
1、先创建一个类
package com.test.hello.vo;
import com.test.hello.utils.Customer1DoubleSerialize;
import com.test.hello.utils.CustomerDoubleSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestVo {
//使用方法,直接加载需要保留小数的字段上
@JsonSerialize(using = Customer1DoubleSerialize.class)
private Double num;
@ApiModelProperty("id")
private String Id;
@ApiModelProperty("名")
private String name;
@ApiModelProperty("数据类型")
@ExcelProperty(converter = UnitConverter.class)
private String dataType;
}
小数点保留一位数
package com.test.hello.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class Customer1DoubleSerialize extends JsonSerializer {
private DecimalFormat df = new DecimalFormat("0.0");
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
df.setRoundingMode(RoundingMode.HALF_DOWN);
if(o.toString() != null && !"-".equals(o)) {
Double dd=Double.parseDouble(o.toString());
jsonGenerator.writeString(df.format(dd));
} else{
jsonGenerator.writeString(o.toString());
}
}
}
小数点保留2位数(保留三位同理定义三位小数即可)
package com.test.hello.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class CustomerDoubleSerialize extends JsonSerializer {
private DecimalFormat df = new DecimalFormat("0.00");
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
df.setRoundingMode(RoundingMode.HALF_DOWN);
if(o.toString() != null && !"-".equals(o)) {
Double dd=Double.parseDouble(o.toString());
jsonGenerator.writeString(df.format(dd));
} else{
jsonGenerator.writeString(o.toString());
}
}
}
在excel导出的时候——拼接单位
package com.test.hello.utils;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class UnitConverter implements Converter<String> {
@Override
public Class<?> supportJavaTypeKey() {
return Converter.super.supportJavaTypeKey();
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return Converter.super.supportExcelTypeKey();
}
@Override
public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
String dateValue = "";
if (value.equals("2D")) {
dateValue = "km";
} else if (value.equals("3D")) {
dateValue = "km2";
}
return new WriteCellData<>(dateValue);
}
}