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

如何将JSON中的嵌套日期时间结构转换为Java DateTime对象

嵌套时间结构JSON转Java DateTime对象的实现方案

有现成的成熟方案,用主流JSON序列化库配合Java 8+原生java.time包即可实现,无需手动逐个读取字段拼接对象。

方案1:Jackson实现(Java生态最常用)

Jackson原生支持匹配你提供的JSON结构,无需自定义解析逻辑:

  • 首先引入依赖(Spring Boot项目默认已集成,可跳过)
<!-- Maven 依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>对应你的Jackson版本</version>
</dependency>
  • 定义极简结构匹配类(可用Lombok的@Data省略getter/setter)
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import lombok.Data;

@Data
public class TimeWrapper {
    private LocalDate date;
    private LocalTime time;
    
    public LocalDateTime getDateTime() {
        return LocalDateTime.of(date, time);
    }
}
  • 直接反序列化即可
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

public class Test {
    public static void main(String[] args) throws Exception {
        String json = "{\"date\":{\"year\":2021,\"month\":11,\"day\":11},\"time\":{\"hour\":10,\"minute\":30,\"second\":45,\"nano\":222000000}}";
        ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
        TimeWrapper wrapper = mapper.readValue(json, TimeWrapper.class);
        LocalDateTime dateTime = wrapper.getDateTime();
    }
}

你的JSON结构刚好和LocalDate、LocalTime的内部字段完全匹配,Jackson会自动完成字段映射,无需额外配置。

方案2:无Wrapper类极简实现

如果不想额外定义Wrapper类,可以自定义一个全局反序列化器,一次注册后所有同结构JSON可直接转为LocalDateTime:

// 自定义反序列化器
public class CustomLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {
    public CustomLocalDateTimeDeserializer() {
        super(LocalDateTime.class);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        JsonNode date = node.get("date");
        JsonNode time = node.get("time");
        return LocalDateTime.of(
                date.get("year").asInt(),
                date.get("month").asInt(),
                date.get("day").asInt(),
                time.get("hour").asInt(),
                time.get("minute").asInt(),
                time.get("second").asInt(),
                time.get("nano").asInt()
        );
    }
}

注册后直接使用:

ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()
        .addDeserializer(LocalDateTime.class, new CustomLocalDateTimeDeserializer()));
// 直接反序列化为LocalDateTime
LocalDateTime dateTime = mapper.readValue(json, LocalDateTime.class);

方案3:Gson实现

如果用Gson库,配合JSR310适配器也能实现同样效果:

  • 引入依赖
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
  • 反序列化代码
Gson gson = new GsonBuilder()
        .registerTypeAdapter(LocalDate.class, new LocalDateTypeAdapter())
        .registerTypeAdapter(LocalTime.class, new LocalTimeTypeAdapter())
        .create();
TimeWrapper wrapper = gson.fromJson(json, TimeWrapper.class);
LocalDateTime dateTime = wrapper.getDateTime();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:45:03