You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何正确将DTO转换为JSON并保留日期原有格式?

你遇到的日期被序列化为多属性对象的问题,是因为Jackson默认没有对Java 8及以上版本引入的JSR310时间类型(Instant、LocalDateTime、OffsetDateTime等)做特殊序列化处理,会直接将时间类的内部字段全部输出。

解决方案1:全局配置ObjectMapper(推荐)

首先引入JSR310序列化支持依赖(如果是Spring Boot项目默认已经集成,无需额外引入),Maven依赖示例:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>匹配你的jackson核心版本</version>
</dependency>

然后修改ObjectMapper的初始化配置,注册时间序列化模块,关闭时间戳输出:

ObjectMapper mapper = new ObjectMapper()
        // 注册JSR310时间类型处理模块
        .registerModule(new JavaTimeModule())
        // 关闭将时间序列化为时间戳/结构对象的特性
        .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
json = mapper.writeValueAsBytes(dto);

该配置会自动将所有JSR310时间类型序列化为ISO8601格式的字符串,和你DTO中原有格式一致。


解决方案2:针对单个字段配置

如果不需要全局统一格式,只需要调整单个日期字段的输出,可以直接在DTO的对应字段上添加@JsonFormat注解:

public class ObjectDto {
    // pattern指定你需要的日期格式,timezone指定时区,这里用UTC对应带Z的ISO格式
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")
    private Instant date;
    // 其他字段、getter setter省略
}

额外建议

ObjectMapper是线程安全的,建议将配置好的实例作为单例注入使用,不要每次序列化都新建对象,既避免重复配置,也能提升性能。

内容的提问来源于stack exchange,提问作者methodinvocation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:06:03