fastjson默认将bigdecimal序列化为字符串以保精度,启用writebigdecimalasplain可输出json数字类型;推荐升级至fastjson2,其默认支持bigdecimal转json数字且无需额外配置。

Fastjson 默认会将 BigDecimal 序列化为字符串(带引号),这是因为它优先保证精度不丢失,避免浮点数转换误差。若希望输出为 JSON 数字(不带引号),需主动配置序列化行为。
启用 WriteBigDecimalAsPlain 配置
Fastjson 提供了 SerializerFeature.WriteBigDecimalAsPlain 选项,它会让 BigDecimal 调用 toPlainString() 输出无科学计数法的纯数字字符串,并在 JSON 中作为数字类型解析(前提是不包含小数点后无意义的 0 或指数形式)。
- 该配置仅影响序列化结果的格式,不改变数值精度
- 适用于大多数业务场景,如金额、数量等需要前端直接参与计算的字段
- 注意:若
BigDecimal值为new BigDecimal("1.00"),toPlainString()返回"1.00",但 JSON 解析器通常仍会将其转为数字1;真正保持两位小数需靠前端格式化,而非 JSON 类型
全局配置方式(推荐)
在应用启动时统一设置,避免每个地方重复写:
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteBigDecimalAsPlain.getMask();
或使用 JSON.toJSONString(obj, SerializerFeature.WriteBigDecimalAsPlain) 按需启用。
自定义 SerializeFilter(更灵活)
若只需对特定字段或类生效,可实现 SerializeFilter 或使用 @JSONField(serializeUsing = ...):
- 定义一个
BigDecimalSerializer实现ObjectSerializer - 在
write()方法中调用out.writeDecimal(value)(Fastjson v1.2.83+ 支持) - 配合
@JSONField(serializeUsing = BigDecimalSerializer.class)标注字段
升级到 Fastjson2(长期建议)
Fastjson2 对数值类型序列化更合理,默认就将 BigDecimal 输出为 JSON number(只要值可无损表示为 double 或整数):
- Maven 引入:
com.alibaba.fastjson2:fastjson2 - 替换 import 并使用
JSON.toJSONString(obj)即可,无需额外配置 - 兼容性好,性能更高,且修复了 v1 版本中部分边界 case 的序列化问题
不复杂但容易忽略,关键是选对配置时机和版本支持。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











