在Java中为枚举定制JSON序列化与反序列化,推荐使用@JsonValue和@JsonCreator注解:@JsonValue标记返回code的方法用于序列化,@JsonCreator标记根据code查找枚举实例的静态工厂方法,实现简洁双向转换。

在 Java 中,为枚举编写自定义 JSON 序列化与反序列化规则,核心是让 Jackson(最常用的 JSON 库)跳过默认行为(如直接序列化为 name 字符串),转而按你定义的逻辑处理——比如序列化为某个字段值(如 code)、反序列化时根据 code 查找对应枚举实例。
使用 @JsonValue + @JsonCreator 实现双向定制
这是最简洁、推荐的方式,适用于大多数场景。只需在枚举中添加两个注解:
- @JsonValue:标记一个方法,表示序列化时该方法的返回值作为 JSON 输出内容;
- @JsonCreator:标记一个静态工厂方法,用于从 JSON 值(如字符串或数字)构造枚举实例。
示例:
public enum Status {
SUCCESS(1, "操作成功"),
FAILED(0, "操作失败");
<pre class="brush:php;toolbar:false;">private final int code;
private final String message;
Status(int code, String message) {
this.code = code;
this.message = message;
}
@JsonValue
public int getCode() {
return code;
}
@JsonCreator
public static Status fromCode(int code) {
for (Status s : Status.values()) {
if (s.code == code) {
return s;
}
}
throw new IllegalArgumentException("Unknown status code: " + code);
}}
这样,Status.SUCCESS 序列化为 1,反序列化 1 也能正确还原为 Status.SUCCESS。
用 @JsonProperty 配合私有字段(仅限 Jackson 2.12+)
如果希望 JSON 中保留多个字段(如 {"code":1,"message":"操作成功"}),可将枚举视为“类”来处理。需配合 @JsonFormat(shape = JsonFormat.Shape.OBJECT):
- 加
@JsonFormat(shape = JsonFormat.Shape.OBJECT)到枚举类上; - 为每个需要暴露的字段添加
@JsonProperty的 getter; - 提供带参数的
@JsonCreator构造器或静态工厂方法。
注意:此时反序列化必须传入 JSON 对象,不能是纯数字或字符串。
全局注册自定义序列化器/反序列化器(适合复用或复杂逻辑)
当逻辑较重(如依赖 Spring Bean、需查数据库、或统一处理多枚举)时,可编写专用的 JsonSerializer 和 JsonDeserializer,再注册到 ObjectMapper:
- 继承
StdSerializer<yourenum></yourenum>实现序列化逻辑; - 继承
StdDeserializer<yourenum></yourenum>实现反序列化逻辑; - 通过
SimpleModule注册,并加入ObjectMapper。
这种方式灵活但略重,适合框架级封装或跨项目复用。
Spring Boot 中的配置建议
若用 Spring Boot,默认的 ObjectMapper 可通过 @Bean 自定义:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Status.class, new StatusSerializer());
module.addDeserializer(Status.class, new StatusDeserializer());
mapper.registerModule(module);
return mapper;
}
也可用 @JsonComponent 更简洁地声明序列化组件(Spring Boot 1.4+ 支持),Jackson 会自动扫描并注册。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











