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
}
}