Java中@JsonFormat注解的使用指南

@JsonFormat 注解是 Jackson 库提供的一个强大工具,用于在序列化和反序列化 Java 对象时自定义 JSON 格式。特别是在 shape = JsonFormat.Shape.STRING 时,它可以将非字符串类型(如日期、枚举、数字等)转换为字符串。以下是一些常见场景及其使用示例。

1. 日期格式化

在处理日期字段时,@JsonFormat 注解允许你指定日期的格式和时区。

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;

@Data
public class User {
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date birthDate;
}

在这个例子中,birthDate 字段将被序列化和反序列化为指定格式的字符串。timezone 参数指定了时区,这里选择 "GMT+8" 是因为中国标准时间是 GMT+8。

2. 将Long类型序列化为字符串

在处理大数值时,前端可能需要将Long类型字段作为字符串处理,以避免精度丢失。

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

@Data
public class User {
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;
}

在这个例子中,id 字段在序列化时将被转换为字符串,确保前端能够正确处理。

3. 序列化和反序列化时固定类型

有时,你可能希望某些类型在序列化和反序列化时保持固定格式,例如将枚举类型转换为字符串。

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

@Data
public class User {
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Status status;

    public enum Status {
        ACTIVE, INACTIVE
    }
}

在这个例子中,status 字段将被序列化为字符串,如 "ACTIVE" 或 "INACTIVE"。

综合示例

以下是一个综合示例,结合了上述所有场景:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;

@Data
public class User {
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date birthDate;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Status status;

    public enum Status {
        ACTIVE, INACTIVE
    }
}

在这个综合示例中,每个字段都使用了 @JsonFormat 注解来指定其序列化和反序列化的行为。

其他属性

@JsonFormat 注解还支持其他属性,如 locale,用于指定本地化设置。你可以根据需要进行配置。

通过这些示例和解释,希望你能够更好地理解和使用 @JsonFormat 注解,以满足不同的序列化需求。