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 对象序列化(转换)为字符串

  • 功能: 它会调用 BigDecimaltoString() 方法,将数字的精确值转换为一个完整的字符串。例如,123.450 会被序列化为 "123.450"100 会被序列化为 "100"

  • 应用场景:

    • 当需要保留数字的精确度时,例如在进行金融计算时。

    • 当数字非常大或非常小,超出了 JavaScript 的安全整数范围(-2^532^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"),这表明它更侧重于展示,希望前端能直接拿到一个带有两位小数的金额字符串。

posted @ 2025-07-15 16:30  难忘是想起  阅读(0)  评论(0)    收藏  举报  来源