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
相关产品推荐
相关产品推荐

