This code snippet is a common pattern used in Java and Spring Boot applications to define how an enum constant should be serialized into JSON.
📝 @JsonValue 的作用
@JsonValue 是 Jackson 库(Spring Boot 默认的 JSON 处理库)提供的一个注解。它的作用是:
- 定义枚举的 JSON 表示: 当 Jackson 序列化(将 Java 对象转换为 JSON 字符串)一个被
@JsonValue注解的方法或字段时,它会使用该方法返回的值或该字段的值作为整个枚举对象的 JSON 值,而不是默认的枚举常量名称。
💻 代码分析
1. 字段定义
java
@JsonValue
private final String code;
这段代码意味着:
private final String code;: 定义了一个私有且不可变的code字段,它存储了该枚举值对应的业务代码 或短标识符。@JsonValue: 将此注解放在字段上,指示 Jackson 在序列化该枚举对象时,应使用该code字段的值作为输出。
2. 示例
假设您有一个表示订单状态的枚举:
java
public enum OrderStatus {
// 枚举常量
PENDING("01", "待付款"),
SHIPPED("02", "已发货"),
DELIVERED("03", "已送达");
// 字段定义
@JsonValue
private final String code;
private final String description;
// 构造函数
OrderStatus(String code, String description) {
this.code = code;
this.description = description;
}
// 通常会省略标准的 getter,因为 @JsonValue 直接作用于字段
// public String getCode() { return code; }
// public String getDescription() { return description; }
}
序列化结果对比 (假设 Java 对象中有一个字段 status = OrderStatus.SHIPPED)
| 序列化场景 | JSON 输出 | 描述 |
|---|---|---|
| 默认序列化 | "status": "SHIPPED" |
Jackson 默认使用枚举常量的名称。 |
使用 @JsonValue |
"status": "02" |
Jackson 使用被 @JsonValue 标记的 code 字段的值。 |
好处: 这样可以确保您的 API 接口返回的是简洁且固定的业务代码 (01, 02) ,而不是依赖于 Java 代码中的枚举名称 (PENDING, SHIPPED),这在与前端或第三方系统对接时非常有用。