You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:45:26