@JsonSerialize序列化注解的使用
作者:200.OK
这篇文章主要介绍了@JsonSerialize序列化注解的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
@JsonSerialize序列化注解
JSON 是数据交换的通用格式
@JsonSerialize注解是Jackson 库中的一部分,用于定义在将 Java 对象序列化为 JSON 格式时,如何进行定制化处理的方式。
Jackson 是一个流行的 Java 库,用于处理 JSON 数据的序列化和反序列化。可以在字段、方法或者类级上自定义序列化类。有using 属性,允许指定一个自定义的序列化器(Serializer)类,来决定如何将 Java 对象转换为 JSON 数据。
用来自定义需要转换为JSON数据,可以用在类上,自定义对这个类的JSON处理,也可以用在字段上自定义对字段的处理,例如日期格式、小数点保留几位,是否准换为1或0
先创建一个类
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); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。