在jackson中,@jsonvalue必须标注在唯一一个无参、非静态、有返回值的公共方法上,用于序列化时输出指定字段值;若需反序列化,须配合@jsoncreator静态工厂方法。

在 Jackson 中,给枚举类加 @JsonValue 是让序列化时只输出某个具体字段值(比如字符串或数字),而不是默认的枚举名(name())。
必须定义一个非静态、非 void、有返回值的 getter 方法
@JsonValue 不能直接标在字段上,只能标在**一个公共的、无参的、有返回值的方法**上。Jackson 会调用这个方法获取要序列化的值。
例如:
public enum Status {
ACTIVE("启用"),
INACTIVE("停用");
private final String desc;
Status(String desc) {
this.desc = desc;
}
@JsonValue
public String getDesc() {
return desc;
}
}
这样,序列化 Status.ACTIVE 就会输出 "启用",而不是 "ACTIVE"。
注意:该方法不能有参数,且整个枚举中只能有一个 @JsonValue 方法
如果误加了参数,比如 getDesc(String prefix),Jackson 会忽略它,回退到默认的 name();如果多个方法都加了 @JsonValue,Jackson 会抛异常(JsonMappingException)。
常见错误写法:
-
@JsonValue public String desc;❌ 字段不支持 -
@JsonValue public String getValue(int flag)❌ 有参数 - 两个不同方法都加
@JsonValue❌ 冲突
配合 @JsonCreator 可实现反序列化双向一致
仅加 @JsonValue 只控制序列化。如果还希望 JSON 字符串(如 "启用")能正确反序列化成对应枚举,需搭配 @JsonCreator 和一个静态工厂方法:
public enum Status {
ACTIVE("启用"),
INACTIVE("停用");
private final String desc;
Status(String desc) {
this.desc = desc;
}
@JsonValue
public String getDesc() {
return desc;
}
@JsonCreator
public static Status fromDesc(String desc) {
for (Status s : Status.values()) {
if (s.desc.equals(desc)) {
return s;
}
}
throw new IllegalArgumentException("Unknown status: " + desc);
}
}
这样 mapper.readValue("\"启用\"", Status.class) 才能成功转成 Status.ACTIVE。
替代方案:用 @JsonProperty 配合枚举字段名(不推荐用于自定义值)
@JsonProperty 在枚举里通常用于标注常量名(如把 ACTIVE 序列化为 "active"),但它不适用于动态字段值;真要输出描述性内容,@JsonValue + getter 是标准做法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











