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

如何在无注解下配置Jackson ObjectMapper格式化Double类型

解决HashMap中Double类型的Jackson序列化精度问题

方法一:自定义Double序列化器并全局注册

直接实现JsonSerializer<Double>来控制Double类型的输出格式,无需创建POJO,配置后全局生效:

  1. 编写自定义序列化器类:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.DecimalFormat;

public class CustomDoubleSerializer extends JsonSerializer<Double> {
    // 自定义格式,这里保留4位小数,可按需修改
    private final DecimalFormat decimalFormat = new DecimalFormat("0.0000");

    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value == null) {
            gen.writeNull();
            return;
        }
        // 输出为格式化后的字符串,若需数字类型可改用gen.writeNumber(decimalFormat.format(value))
        gen.writeString(decimalFormat.format(value));
    }
}
  1. 在ObjectMapper中注册该序列化器:
ObjectMapper o = new ObjectMapper();
// 注册自定义Double序列化器
o.registerModule(new SimpleModule().addSerializer(Double.class, new CustomDoubleSerializer()));
// 保留你的日期格式化配置
o.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

String jsonStr = o.writeValueAsString(m);

方法二:转BigDecimal处理精度(数字类型输出)

如果Web服务要求输出严格数字类型而非字符串,可配置ObjectMapper将Double转为BigDecimal后序列化,从根源避免浮点精度丢失:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.math.BigDecimal;

ObjectMapper o = new ObjectMapper();
// 强制将浮点类型转为BigDecimal处理
o.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
// 配置BigDecimal以普通数字格式输出
o.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true);
// 自定义BigDecimal的小数位数
o.registerModule(new SimpleModule()
        .addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() {
            private final DecimalFormat df = new DecimalFormat("0.0000");
            @Override
            public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeNumber(df.format(value));
            }
        }));

o.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
String jsonStr = o.writeValueAsString(m);

注意事项

  • 若选择字符串输出,需确认Web服务端能正确解析;要求数字类型时优先用BigDecimal方案。
  • DecimalFormat格式可灵活调整:"#.####"会自动去除末尾无效零,"0.0000"则强制保留4位小数。

内容的提问来源于stack exchange,提问作者Dnamedia_Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:10:28