Java开发中遇到时间和金额入参和出参处理
导入pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.0</version> <!-- 版本号可根据实际需求调整,建议使用较新稳定版 -->
</dependency>
出参关于时间字段转成年月日时分秒+时差
-- 数据库字段类型
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

注册时间转为年月日时分秒 如果用的是Date类型一定要加上指定时区 不然会有8小时的时差
//二选一
//@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; //注册时间
出参如果用的是LocalTime类型可以不加上指定时区
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalTime createTime; //注册时间
出参关于金额字段返回字符串类型
`total_fee` decimal(10,2) DEFAULT NULL COMMENT '总价'

@JsonSerialize(using = ToStringSerializer.class)
private BigDecimal totalFee; //总价
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.00")
private BigDecimal totalConsumption; //总支出金额
这两种 Jackson 注解 @JsonSerialize(using = ToStringSerializer.class) 和 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.00") 都可以用在 BigDecimal 类型上,但它们的作用和目的完全不同。
@JsonSerialize(using = ToStringSerializer.class)
这个注解的作用是将 BigDecimal 对象序列化(转换)为字符串。
-
功能: 它会调用
BigDecimal的toString()方法,将数字的精确值转换为一个完整的字符串。例如,123.450会被序列化为"123.450",100会被序列化为"100"。 -
应用场景:
-
当需要保留数字的精确度时,例如在进行金融计算时。
-
当数字非常大或非常小,超出了 JavaScript 的安全整数范围(
-2^53到2^53)时。如果直接序列化为 JSON number 类型,可能会导致精度丢失。 -
当你希望前端接收到的是字符串,而不是数字类型,以避免浏览器端的浮点数计算问题。
-
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.00")
这个注解的作用是将 BigDecimal 对象格式化为指定模式的字符串。
-
功能:
-
shape = JsonFormat.Shape.STRING: 强制将该字段序列化为 JSON 字符串类型。 -
pattern = "0.00": 按照指定的模式对数字进行格式化。这里的"0.00"表示会保留两位小数,不足两位时补零。例如,123.456会被格式化为"123.46"(四舍五入),123.4会被格式化为"123.40"。
-
-
应用场景:
-
当需要控制输出的格式时,例如要求始终显示两位小数。
-
用于前端展示,因为它直接提供了格式化的结果,省去了前端额外处理的步骤。
-
在一些 API 接口中,为了统一数据格式而使用。
-
总结区别
| 特性 | @JsonSerialize(using = ToStringSerializer.class) | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.00") |
| 功能 | 将 BigDecimal 的原始值转换为字符串 | 将 BigDecimal 格式化为指定模式的字符串 |
| 输出格式 | 精确的、完整的字符串,例如 "123.45" | 按照 pattern 格式化,例如 "123.45" 或 "123.40" |
| 主要目的 | 防止大数字精度丢失,确保数据完整性 | 控制输出格式,方便前端直接展示 |
| 示例 | 12.3 -> "12.3" | 12.3 -> "12.30" |
| 示例 | 12.30 -> "12.30" | 12.30 -> "12.30" |
在你的代码中:
-
totalFee使用@JsonSerialize(using = ToStringSerializer.class),表示它是一个需要保持精确性的金额总数,可能用于后续的计算或验证,因此不应该随意改变它的格式。 -
totalConsumption使用@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.00"),这表明它更侧重于展示,希望前端能直接拿到一个带有两位小数的金额字符串。

浙公网安备 33010602011771号