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

