serialize()定义序列化处理方法,这里是处理后端给前端,前端收到的数据格式为两位小数
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Objects;
@JsonComponent
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> implements ContextualSerializer {
private String format = "#####0.00";
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(new DecimalFormat(format).format(bigDecimal));
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
if(beanProperty !=null ){
if(Objects.equals(beanProperty.getType().getRawClass(),BigDecimal.class)){
BigDecimalFormat bigDecimalFormat = beanProperty.getAnnotation((BigDecimalFormat.class));
if(bigDecimalFormat == null){
bigDecimalFormat = beanProperty.getContextAnnotation(BigDecimalFormat.class);
}
BigDecimalSerializer bigDecimalSerializer = new BigDecimalSerializer();
if(bigDecimalFormat != null){
bigDecimalSerializer.format = bigDecimalFormat.value();
}
return bigDecimalSerializer;
}
return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
}
return serializerProvider.findNullValueSerializer(beanProperty);
}
}
定义反序列化方法,这里的处理主要是把前端传来的类似"1,000,000,000.348"这种用“,”逗号分隔的数字字符串去逗号,转回BigDecimal类型,后端接收
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.math.BigDecimal;
@JsonComponent
public class BigDecimalDeSerializer extends JsonDeserializer<BigDecimal> {
@Override
public BigDecimal deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return new BigDecimal(jsonParser.getText().replaceAll(",",""));
}
}
通过自定义注解的方式实现拦截
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)
@JsonDeserialize(using = BigDecimalDeSerializer.class)
public @interface BigDecimalFormat {
String value() default "#####0.00";
}
参考链接:
https://blog.youkuaiyun.com/qq_39930070/article/details/124234516
https://www.jianshu.com/p/db07543ffe0a