WRITE_BIGDECIMAL_AS_PLAIN 是 Jackson 中启用 BigDecimal 非科学计数法输出的配置项,开启后调用 toPlainString() 输出如 "0.00001",默认 false 需显式设为 true,且仅对 BigDecimal 类型生效。

在 Jackson 中,WRITE_BIGDECIMAL_AS_PLAIN 是一个序列化配置项,用于控制 BigDecimal 是否以非科学计数法(即 plain string)形式输出,避免出现 1E-5 这类表示。它本身不是“禁止科学计数法”的开关,而是**启用 plain 格式输出的开关**——开启后,Jackson 会调用 BigDecimal.toPlainString(),天然规避科学计数法;关闭则可能使用 toString()(在某些精度/值下会返回科学计数表示)。
确认并启用 WRITE_BIGDECIMAL_AS_PLAIN
这是最直接有效的做法。该配置默认是 false,需显式设为 true:
- 全局配置(推荐):
mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true); // 可选:确保浮点数也转为 BigDecimal
mapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true);
- 局部配置(如 Spring Boot):
spring:
jackson:
serialization: WRITE_BIGDECIMAL_AS_PLAIN
注意 toPlainString() 的行为边界
启用该配置后,Jackson 内部对每个 BigDecimal 调用 toPlainString(),它始终返回不带指数的字符串(如 "0.00001" 而非 "1E-5")。但需注意:
- 该方法不会自动去除末尾零(如
new BigDecimal("1.00")→"1.00") - 若需标准化(如去掉冗余小数位),应在业务层调用
stripTrailingZeros().toPlainString() - 它不改变数值精度,仅影响字符串表示形式
避免被其他配置干扰
某些场景下即使启用了 WRITE_BIGDECIMAL_AS_PLAIN,仍可能出现科学计数,常见原因包括:
- 对象字段类型不是
BigDecimal,而是double或float—— 此时该配置无效,应改用BigDecimal类型或自定义序列化器 - 使用了自定义
JsonSerializer却未调用toPlainString() - Spring Boot 中配置 key 写错(如写成
write_big_decimal_as_plain而非正确驼峰WRITE_BIGDECIMAL_AS_PLAIN)
验证输出效果
简单测试可确认是否生效:
BigDecimal bd = new BigDecimal("0.000001");String json = mapper.writeValueAsString(Map.of("value", bd));
// 启用后输出:{"value":"0.000001"}
// 关闭时可能输出:{"value":"1E-6"}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











