使用Jackson序列化枚举如何通过注解自动处理并添加外层标签
方案说明
你当前使用的@JsonFormat(shape = JsonFormat.Shape.OBJECT)本身就是纯注解实现枚举序列化为对象的方案,不需要手写循环拼接每个枚举值的JSON字符串,ObjectMapper会自动识别该注解完成序列化。
针对添加外层entries标签的需求,有两种更简洁的实现方式:
方案1:注解+DTO包装类(完全基于注解,无手动容器构造)
- 新增简单包装类,添加根序列化注解:
import com.fasterxml.jackson.annotation.JsonRootName; import java.util.List; @JsonRootName("entries") public class MyTypeWrapper { private List<MyType> entries; public MyTypeWrapper(List<MyType> entries) { this.entries = entries; } // 必须提供getter方法,Jackson序列化需要读取字段 public List<MyType> getEntries() { return entries; } }
- 开启ObjectMapper的根包装配置,直接序列化包装类即可:
ObjectMapper om = new ObjectMapper(); om.enable(com.fasterxml.jackson.databind.SerializationFeature.WRAP_ROOT_VALUE); String result = om.writeValueAsString(new MyTypeWrapper(Arrays.asList(MyType.values())));
输出格式完全符合要求:{"entries":[{"value":"Entry"}]}
方案2:轻量容器构造(无需额外类,适合少量场景使用)
你目前用到的HashMap方案已经很简洁,也可以用Jackson自带的ObjectNode避免泛型擦除问题:
ObjectMapper om = new ObjectMapper(); com.fasterxml.jackson.databind.node.ObjectNode root = om.createObjectNode(); root.putPOJO("entries", MyType.values()); try { return om.writeValueAsString(root); } catch (JsonProcessingException e) { e.printStackTrace(); return ""; }
补充注意
你当前的枚举代码存在语法问题,ENTRY("Entry")后面需要加分号才能正常编译。
如果是SpringBoot项目,直接将包装类对象作为Controller接口的返回值即可,不需要手动调用ObjectMapper序列化,框架会自动完成转换。
内容的提问来源于stack exchange,提问作者orion_kid
相关产品推荐
相关产品推荐

