如何在无注解下配置Jackson ObjectMapper格式化Double类型
解决HashMap中Double类型的Jackson序列化精度问题
方法一:自定义Double序列化器并全局注册
直接实现JsonSerializer<Double>来控制Double类型的输出格式,无需创建POJO,配置后全局生效:
- 编写自定义序列化器类:
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)); } }
- 在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
相关产品推荐
相关产品推荐

