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

Spring Boot中如何将JSON数组格式LocalDate转为当日起始LocalDateTime

方案1:使用Jackson自定义反序列化器实现(适配数组格式最稳定)

先编写自定义反序列化类,实现从[年,月,日]格式数组到当日零点LocalDateTime的转换:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class LocalDateArrayToLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {

    public LocalDateArrayToLocalDateTimeDeserializer() {
        super(LocalDateTime.class);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // Jackson默认支持[年,月,日]数组直接反序列化为LocalDate
        LocalDate date = p.readValueAs(LocalDate.class);
        // 转换为当日零点的LocalDateTime
        return date.atStartOfDay();
    }
}

之后在DTO字段上添加@JsonDeserialize注解指定上述反序列化器即可:

public class MyDto{
    @JsonProperty("transactiedatum")
    @JsonDeserialize(using = LocalDateArrayToLocalDateTimeDeserializer.class)
    private LocalDateTime verstuurdOp;
    // 省略getter、setter
}

方案2:简化实现(无需额外新增类)

如果不想新增反序列化类,也可以先把字段类型改成LocalDate,Jackson会自动完成数组到LocalDate的转换,需要使用LocalDateTime时手动调用转换方法即可:

public class MyDto{
    @JsonProperty("transactiedatum")
    private LocalDate verstuurdOp;

    // 直接封装转换逻辑,调用时直接用这个getter即可拿到零点的LocalDateTime
    public LocalDateTime getVerstuurdOpStartOfDay() {
        return verstuurdOp != null ? verstuurdOp.atStartOfDay() : null;
    }
}

注意:Spring Boot的spring-boot-starter-web场景默认已经引入了JSR310时间类型的Jackson适配依赖jackson-datatype-jsr310,不需要额外引入即可正常使用上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:54:04