jacksonjson 反序列化localdatetime指定格式输出

在使用 Jackson 进行 JSON 反序列化时,如果需要将 JSON 中的日期时间字符串转换为 LocalDateTime 类型,并指定特定的格式,可以使用 @JsonFormat 注解。以下是具体的使用方法:


1. 添加依赖

确保你的项目中已经引入了 Jackson 依赖。如果使用 Maven,可以在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

jackson-datatype-jsr310 是 Jackson 对 Java 8 日期时间类型(如 LocalDateTime)的支持模块。


2. 在实体类中使用 @JsonFormat

在实体类的 LocalDateTime 字段上添加 @JsonFormat 注解,并指定日期时间的格式:

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;

public class Order {

    private String orderId;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 指定日期时间格式
    private LocalDateTime purchaseTime;

    // 省略其他字段、构造方法、getter 和 setter
}

3. 全局配置日期时间格式

如果你希望在整个应用中统一 LocalDateTime 的序列化和反序列化格式,可以在 application.propertiesapplication.yml 中配置 Jackson 的默认行为:

application.properties

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

application.yml

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

4. 自定义 ObjectMapper

如果需要更灵活地配置 Jackson 的行为,可以自定义 ObjectMapper 并注册 JavaTimeModule

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule()); // 注册 JavaTimeModule
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 禁用时间戳格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 设置日期格式
        return objectMapper;
    }
}

5. 示例:完整代码

实体类

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;

public class Order {

    private String orderId;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime purchaseTime;

    // 省略其他字段、构造方法、getter 和 setter
}

控制器

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @PostMapping("/order")
    public String createOrder(@RequestBody Order order) {
        return "Order created with purchase time: " + order.getPurchaseTime();
    }
}

测试 JSON

{
  "orderId": "12345",
  "purchaseTime": "2023-10-01 14:30:00"
}

6. 注意事项

  • @JsonFormat 注解可以同时用于序列化和反序列化。
  • 如果 JSON 中的日期时间格式与 @JsonFormat 指定的格式不匹配,Jackson 会抛出异常。
  • 如果需要处理时区问题,可以在 @JsonFormat 中指定 timezone 属性,例如:
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime purchaseTime;
    

通过以上方式,你可以轻松地在 Spring Boot 中使用 Jackson 反序列化 LocalDateTime 并指定日期时间格式。

posted @ 2025-01-07 16:48  java渣渣  阅读(527)  评论(0)    收藏  举报