@jsoncreator的核心作用是显式指定jackson将json字符串或对象转换为枚举实例的静态工厂方法或构造器,解决默认仅支持枚举name()匹配的局限;当json值为小写字符串、自定义code或嵌套对象时,必须通过@jsoncreator标注的方法按code、desc等属性精确查找已有枚举实例。

Java 枚举类在 Jackson 反序列化中使用 @JsonCreator,核心是让 Jackson 知道:**该用哪个构造方法(或静态工厂方法)来把 JSON 字符串/对象转成枚举实例**,尤其当枚举字段不是简单的名字(name),而是自定义属性(如 code、desc)时。
为什么需要 @JsonCreator?
默认情况下,Jackson 只认枚举的 name()(即大写常量名)。比如:{"status": "ACTIVE"} 能自动映射到 Status.ACTIVE。但若 JSON 是 {"status": "active"} 或 {"status": {"code": "A", "desc": "启用"}},就必须显式告诉 Jackson 怎么解析——@JsonCreator 就是用来标记这个“创建入口”的。
单参数字符串反序列化(最常用)
适用于 JSON 中字段值为字符串,需按自定义字段(如 code)匹配枚举:
public enum Status {
ACTIVE("A", "启用"),
INACTIVE("I", "停用");
private final String code;
private final String desc;
Status(String code, String desc) {
this.code = code;
this.desc = desc;
}
// ✅ 标记静态工厂方法,Jackson 会传入 JSON 字符串(如 "A")
@JsonCreator
public static Status fromCode(String code) {
for (Status s : Status.values()) {
if (s.code.equals(code)) {
return s;
}
}
throw new IllegalArgumentException("Unknown code: " + code);
}
public String getCode() { return code; }
}
此时 JSON {"status": "A"} 就能正确反序列化为 Status.ACTIVE。
多参数反序列化(JSON 对象形式)
当 JSON 字段本身是对象(如 {"status": {"code": "A", "desc": "启用"}}),需配合 @JsonProperty 指定参数名:
public enum Role {
ADMIN("001", "系统管理员"),
USER("002", "普通用户");
private final String code;
private final String name;
Role(String code, String name) {
this.code = code;
this.name = name;
}
// ✅ 标记带 @JsonProperty 的构造方法
@JsonCreator
public Role(
@JsonProperty("code") String code,
@JsonProperty("name") String name) {
// 注意:这里不能直接赋值给 enum field(final),需查表
// 所以更推荐用静态工厂方式(见下一条)
throw new UnsupportedOperationException("Use fromCodeAndName instead");
}
@JsonCreator
public static Role fromCodeAndName(
@JsonProperty("code") String code,
@JsonProperty("name") String name) {
for (Role r : Role.values()) {
if (r.code.equals(code) && r.name.equals(name)) {
return r;
}
}
return null;
}
}
关键细节和建议
-
必须是 static 方法或私有构造器:Jackson 调用时不依赖已有实例,所以
@JsonCreator方法必须是static(推荐)或私有构造器(不推荐,因 enum 构造器隐式私有且不能重载用于反序列化) -
方法名任意,但参数要对齐:参数数量、类型、
@JsonProperty名称需与 JSON 结构一致;单字符串参数默认匹配整个 JSON 值 -
务必处理未匹配情况:抛出
IllegalArgumentException或返回默认值(如UNKNOWN),否则 Jackson 会报InvalidFormatException -
避免在 @JsonCreator 中直接 new 枚举实例:enum 实例只能由 JVM 在类加载时创建,运行时不能 new,所以必须通过
values()查找已存在实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











