Skip to content

JAVA开发必会之@JsonFormat转换

1、简介

@JsonFormat 是 Jackson 框架中用于精准控制数据序列化与反序列化时输出格式的注解,广泛应用于日期、时间、数值等类型的格式转换。它通过声明式配置将 Java 对象属性映射为符合业务需求的 JSON 结构,例如将 Date 类型转为2025-05-07 或带时区的2025-05-07T23:59:59+08:00

2、Student类

java
package com.xx.entity;

import lombok.Data;

import java.util.Date;

/**
 * @Author: xueqimiao
 * @Date: 2025/5/7 10:46
 */
@Data

public class Student {

    private Long id;

    private String firstName;
    
    private String lastName;

    private Date createTime;

    private StudentStatus status ;

    public Student() {
    }

    public Student(Long id, String firstName, String lastName, Date createTime,StudentStatus status) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.createTime = createTime;
        this.status = status;
    }
}

3、StudentStatus

java
package com.xx.entity;

/**
 * @Author: xueqimiao
 * @Date: 2025/5/7 10:56
 */
//@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum StudentStatus {

    ACTIVE("活跃", 100, true),

    INACTIVE("不活跃", 101, false),

    PENDING("待激活", 102, false);

    private final String description;
    private final int code;
    private final boolean isActive;

    StudentStatus(String description, int code, boolean isActive) {
        this.description = description;
        this.code = code;
        this.isActive = isActive;
    }

    public String getDescription() {
        return description;
    }

    public int getCode() {
        return code;
    }

    public boolean isActive() {
        return isActive;
    }


}

4、StudentController

java
package com.xx.controller;

import com.xx.entity.Student;
import com.xx.entity.StudentStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * @Author: xueqimiao
 * @Date: 2025/5/7 10:47
 */
@RestController
@RequestMapping("/student")
public class StudentController {

    @GetMapping("/get")
    public ResponseEntity<Student> query(@RequestParam Long id) {
        return ResponseEntity.ok(new Student(id, "XX", "Blog", new Date(), StudentStatus.ACTIVE));
    }
}

5、什么都不加测试

http
http://127.0.0.1:8002/java-mustok/student/get?id=1
json
{
    "id": 1,
    "firstName": "XX",
    "lastName": "Blog",
    "createTime": "2025-05-07T03:09:45.340+00:00",
    "status": "ACTIVE"
}

这其中的createTime日期字段默认使用的ISO 8601 标准中的扩展格式,该格式说明:

  • 2025-05-07:日期部分(年-月-日)
  • T:日期与时间的分隔符
  • 03:09:45.340:时间部分(时:分:秒.毫秒)
  • +00:00:时区偏移量(UTC+0)

这种默认的时间展示不符合我们的习惯(yyyy-MM-dd HH:mm:ss),并且时间还差了8小时

6、配置文件方式

yaml
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
json
{
    "id": 1,
    "firstName": "XX",
    "lastName": "Blog",
    "createTime": "2025-05-07 11:11:56",
    "status": "ACTIVE"
}

7、使用@JsonFormat注解

  • java
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025-05-07 11:13:38",
        "status": "ACTIVE"
    }
  • java
    @JsonFormat(timezone = "Asia/Shanghai",pattern = "yyyy-MM-dd E HH:mm:ss",locale="zh")
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025-05-07 周三 11:14:20",
        "status": "ACTIVE"
    }
  • java
    @JsonFormat(pattern = "yyyy-MM-dd EEEE HH:mm:ss", timezone = "GMT+8")
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025-05-07 星期三 11:14:48",
        "status": "ACTIVE"
    }
  • java
    // lenient = OptBoolean.TRUE 错误的日期自动修复 自动将日期修复到下一个合法的日期。
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8",lenient = OptBoolean.TRUE)
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025-05-07 11:15:43",
        "status": "ACTIVE"
    }
  • java
    // 指定本地语言和类型
    @JsonFormat(pattern = "yyyy MMMM dd a", locale = "en")
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025 May 07 AM",
        "status": "ACTIVE"
    }
  • java
    @JsonFormat(pattern = "yyyy MMMM dd a", locale = "zh")
    json
    {
        "id": 1,
        "firstName": "XX",
        "lastName": "Blog",
        "createTime": "2025 五月 07 上午",
        "status": "ACTIVE"
    }

8、常用 pattern字母及含义

字母含义示例
y年(year)yyyy → 2025,yy → 25
M月(month)MM → 05,MMM → May(英文),MMMM → 五月(中文环境)
d日(day)dd → 07
E星期(day of week)E → 周三 / Wed,EEEE → 星期三 / Wednesday
H小时(0-23)HH → 13
h小时(1-12)hh → 01
m分钟(minute)mm → 45
s秒(second)ss → 09
S毫秒(millisecond)SSS → 235
a上午/下午a → 上午 / PM
z时区(缩写)z → CST、PST
Z时区(RFC822)Z → +0800

9、处理枚举类型

java
// 序列化时会输出为 一个对象(Object)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum StudentStatus {}
json
{
    "id": 1,
    "firstName": "XX",
    "lastName": "Blog",
    "createTime": "2025 五月 07 上午",
    "status": {
        "description": "活跃",
        "code": 100,
        "active": true
    }
}