ycgyab 2024-03-30 18:10 采纳率: 0%
浏览 360
已结题

BigDecimal序列化后小数位的0被删除

解决BigDecimal序列化后小数位的0被删除 sping boot用的2.5怎么统一配置处理

  • 写回答

24条回答

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-30 18:10
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在Spring Boot应用中,当您发现BigDecimal对象在序列化后小数位的零被删除时,这通常是由于JSON库(如Jackson)默认对数字格式化的方式导致的。要解决这个问题,您可以自定义Jackson的序列化设置,确保BigDecimal类型的小数部分保留足够的精度。

    首先,创建一个自定义的JsonSerializer来处理BigDecimal类型:

    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.BigDecimal;
    
    public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    
        @Override
        public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            String formatted = value.toPlainString(); // 或者使用 `value.setScale(2, RoundingMode.HALF_UP).toPlainString()` 来设置固定的小数位数
            gen.writeString(formatted);
        }
    }
    

    接下来,在Spring Boot中注册这个自定义序列化器,通常是在配置类中完成:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class JacksonConfig {
    
        @Bean
        public ObjectMapper objectMapper() {
            ObjectMapper objectMapper = new ObjectMapper();
            SimpleModule module = new SimpleModule();
            module.addSerializer(BigDecimal.class, new BigDecimalSerializer());
            objectMapper.registerModule(module);
            return objectMapper;
        }
    }
    

    这样,您的BigDecimal对象在序列化为JSON字符串时就会保留小数位的0了。如果您希望全局统一处理所有BigDecimal类型的序列化行为,上述配置将会生效。不过,请注意,这种方式会影响到整个应用中所有的BigDecimal对象的序列化方式,如果只针对某些字段有此需求,则可以在对应的实体类属性上使用@JsonSerialize(using = BigDecimalSerializer.class)注解进行精确控制。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 赞助了问题酬金15元 3月30日
  • 创建了问题 3月30日