求助:JSON字符串转Map时BigDecimal值被截断为Double,如何保留原值?
JSON字符串转Map时保留BigDecimal精度的解决方案
问题核心
把JSON字符串转成Map<String, Object>时,像示例里的600.014545218781256这种高精度数字,会被默认解析成Double类型,导致精度丢失(截断为600.0145452187812)。你之前试的JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS是序列化阶段的配置(Java对象转JSON时用),对JSON转Map的反序列化过程没用。
解决方案:配置ObjectMapper解析浮点数为BigDecimal
启用Jackson的DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS特性,让ObjectMapper解析JSON数字时直接转为BigDecimal类型,完整保留原始精度。
代码示例
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; import java.math.BigDecimal; import java.util.Map; public class JsonToMapWithPrecision { public static void main(String[] args) throws Exception { // 初始化ObjectMapper并配置精度保留规则 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true); // 示例JSON字符串 String jsonStr = "{\"amount\":600.014545218781256,\"currency\": \"SATS\"}"; // 转换为带高精度数字的Map Map<String, Object> resultMap = objectMapper.readValue( jsonStr, new TypeReference<Map<String, Object>>() {} ); // 验证精度是否保留 BigDecimal amount = (BigDecimal) resultMap.get("amount"); System.out.println(amount); // 输出:600.014545218781256 } }
补充说明
- 这个配置只对JSON里的浮点数生效,整数类型(比如
100)还是会被解析成Long或Integer,不影响其他数字类型的正常解析。 - 转换后的Map中,
amount字段直接是BigDecimal类型,不用额外转换就能直接用于高精度计算。
内容的提问来源于stack exchange,提问作者Vandit Shah
相关产品推荐
相关产品推荐

