You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jackson序列化枚举如何通过注解自动处理并添加外层标签

方案说明

你当前使用的@JsonFormat(shape = JsonFormat.Shape.OBJECT)本身就是纯注解实现枚举序列化为对象的方案,不需要手写循环拼接每个枚举值的JSON字符串,ObjectMapper会自动识别该注解完成序列化。

针对添加外层entries标签的需求,有两种更简洁的实现方式:

方案1:注解+DTO包装类(完全基于注解,无手动容器构造)

  1. 新增简单包装类,添加根序列化注解:
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;
    }
}
  1. 开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:54:03