SpringBoot解决BigDecimal传到前端后精度丢失问题
1、局部处理
(1)在相应字段上加@JsonFormat @JsonFormat(shape = JsonFormat.Shape.STRING)
(2)在相应字段上加@JsonSerialize
@JsonSerialize(using= ToStringSerializer.class)
2、全局处理
(1)ToStringSerializer 配置类 @Configuration public class JacksonConfig { @Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 全局配置序列化返回 JSON 处理 SimpleModule simpleModule = new SimpleModule(); // 将使用String来序列化BigDecimal类型 simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); return objectMapper; } }
(2)自定义序列化器 //自定义序列化类 @JacksonStdImpl class BigDecimalToStringSerializer extends ToStringSerializer { public final static BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer(); public BigDecimalToStringSerializer() { super(Object.class); } public BigDecimalToStringSerializer(Class<?> handledType) { super(handledType); } @Override public boolean isEmpty(SerializerProvider prov, Object value) { if (value == null) { return true; } String str = ((BigDecimal) value).stripTrailingZeros().toPlainString(); return str.isEmpty(); } @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(((BigDecimal) value).stripTrailingZeros().toPlainString()); // 如果要求所有BigDecimal保留两位小数,可以这么写: // gen.writeString(((BigDecimal) value).setScale(2, RoundingMode.HALF_UP) // .stripTrailingZeros().toPlainString()); } @Override public void serializeWithType(Object value, JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer) throws IOException { // no type info, just regular serialization serialize(value, gen, provider); } } //配置类 @Configuration public class JacksonConfig { @Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 全局配置序列化返回 JSON 处理 SimpleModule simpleModule = new SimpleModule(); // 将使用String来序列化BigDecimal类型 simpleModule.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance); objectMapper.registerModule(simpleModule); return objectMapper; } }
参考:https://www.jb51.net/article/250548.htm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-09-07 Mysql 允许远程连接的方法
2021-09-07 Mysql 连接出现 Authentication plugin 'caching_sha2_password' cannot be loaded
2021-09-07 maven packaging 属性
2021-09-07 Linux 虚拟机安装nginx 无法访问