第一种方案
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
@SneakyThrows
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
if (null != bigDecimal ) {
String plainString = bigDecimal.stripTrailingZeros().toPlainString();
jsonGenerator.writeString(plainString);
} else {
jsonGenerator.writeString(BigDecimal.ZERO.toPlainString());
}
}
}
在需要的字段上加上注解
@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal price;
后端统一处理返回前端Long返回前端损失精度问题
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ObjectMapper.class)
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class JacksonConfiguration {
@Bean
@ConditionalOnMissingBean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
builder.serializerByType(Long.class, ToStringSerializer.instance);
builder.serializerByType(BigDecimal.class, ToStringSerializer.instance);
builder.modules(new PigJavaTimeModule());
};
}
}
第二种方式
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value != null) {
gen.writeString(value.stripTrailingZeros().toPlainString());
}
}
});
objectMapper.registerModule(module);
return objectMapper;
}
}