@JsonValue 的作用

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 处理库)提供的一个注解。它的作用是:

  1. 定义枚举的 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),这在与前端或第三方系统对接时非常有用。