java枚举json序列化默认只输出name(),要同时输出名称和编码需自定义逻辑:一是为枚举添加带public getter的字段;二是用@jsonserialize实现stdserializer手动控制结构;三是避免write_enums_using_to_string等无效配置。

Java 枚举类在 JSON 序列化时默认只输出 name()(即枚举常量名),若想同时输出名称(Name)和编码(Code),需自定义序列化逻辑,核心是让 Jackson 能识别并序列化你希望暴露的字段。
为枚举添加可序列化的字段和 getter
定义枚举时,显式声明业务字段(如 code、desc),并提供公共 getter 方法。Jackson 默认会序列化所有 public getter 返回的值(前提是开启相应配置)。
- 确保字段有对应的 public getter(如
getCode()、getDesc()) - 避免使用
privategetter 或未遵循 JavaBean 命名规范的方法(如getCODE()) - 不要依赖
toString()或name()自动映射——它们不会被自动包含
用 @JsonFormat 配合自定义序列化器(推荐)
若需完全控制输出结构(例如固定为 {"name":"XXX","code":123}),建议实现 JsonSerializer 并通过 @JsonSerialize 注解绑定。
- 编写一个继承
StdSerializer<yourenum></yourenum>的序列化器,在serialize()中手动写入 name 和 code 字段 - 在枚举类上加
@JsonSerialize(using = YourEnumSerializer.class) - 这样能彻底避免字段命名歧义,也兼容复杂逻辑(如动态 desc、国际化等)
启用 WRITE_ENUMS_USING_TO_STRING 或 WRITE_ENUMS_USING_INDEX(不推荐)
这两个 Jackson 配置仅影响枚举整体输出形式(字符串 or 序号),无法实现“同时输出 name + code”的结构化 JSON,因此不适用该需求。
-
WRITE_ENUMS_USING_TO_STRING:调用toString(),需重写它返回 JSON 字符串(不安全且难维护) -
WRITE_ENUMS_USING_INDEX:只输出序号,与目标无关
配合 @JsonValue 实现单字段定制(有限场景可用)
若只需把某个字段(如 code)作为主值序列化,同时保留 name 可读性,可在 getter 上加 @JsonValue。但注意:一个类只能有一个 @JsonValue 方法,所以无法同时标记两个字段。
- 例如在
getCode()上加@JsonValue,则序列化结果仅为123(纯数字),丢失 name - 若想结构化输出,必须放弃
@JsonValue,改用自定义序列化器或带 getter 的 POJO 风格枚举
不复杂但容易忽略:Jackson 对枚举的默认行为很保守,必须主动“告诉”它哪些字段要序列化——要么靠标准 getter + 默认配置,要么靠自定义序列化器精准控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











