Jackson中JSON数字反序列化为BigDecimal支持多少位小数?如何支持20位?
1. Jackson支持的小数位数上限
Jackson本身对BigDecimal类型的小数位数没有强制限制,只要配置正确可完整保留任意位数的小数。你遇到的18位截断问题,是因为默认配置下Jackson会将JSON中的小数先转换为Double类型中转,而Double的十进制有效精度仅为15~17位,超过范围的数值会自动四舍五入,才会出现精度丢失。
2. 支持20位小数的实现方案
有两种常用方案,可根据业务场景选择:
方案1:全局配置反序列化特性(保留数值类型输出)
无需修改序列化输出的JSON结构,仍保持数值类型,只要开启Jackson的USE_BIG_DECIMAL_FOR_FLOATS反序列化特性即可。开启后Jackson会直接将JSON中的小数解析为BigDecimal,不会经过Double中转,完全保留精度。
SpringBoot项目配置示例:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 直接将浮点数解析为BigDecimal,避免Double中转导致的精度丢失 objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); return objectMapper; } }
普通Java项目直接在实例化ObjectMapper时开启该特性即可。
方案2:序列化为字符串类型(兼容性更强)
如果担心跨端场景下其他客户端解析JSON数值时也出现精度丢失,可以使用@JsonFormat(shape = JsonFormat.Shape.STRING)注解标记BigDecimal字段:
@JsonFormat(shape = JsonFormat.Shape.STRING) private BigDecimal value;
序列化后输出格式如下:
"value" : "0.01234567890123456789"
Jackson原生支持将该字符串格式的数值直接反序列化为BigDecimal类型,不需要额外自定义反序列化器,可完整保留20位精度,适合对外接口等兼容性要求高的场景。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

