Spring Boot Jackson泛型序列化:ResponseWrapper字段名替换问题
解决泛型包装类ResponseWrapper序列化时替换键为@JsonRootName值的问题
这问题我之前做接口返回包装类的时候也踩过坑,Jackson默认不会自动识别泛型参数里的@JsonRootName注解,所以才会输出mObject而不是你想要的dog。给你两个靠谱的解决思路:
方案一:自定义序列化器(推荐)
直接给ResponseWrapper<T>写一个自定义序列化器,动态读取泛型实例的@JsonRootName注解值来替换字段键:
首先创建序列化器类:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.annotation.JsonRootName; import java.io.IOException; public class ResponseWrapperSerializer extends JsonSerializer<ResponseWrapper<?>> { @Override public void serialize(ResponseWrapper<?> wrapper, JsonGenerator gen, SerializerProvider serializers) throws IOException { Object data = wrapper.getmObject(); if (data == null) { gen.writeNull(); return; } // 获取目标类的@JsonRootName注解值,没有的话 fallback 到原字段名 JsonRootName rootName = data.getClass().getAnnotation(JsonRootName.class); String fieldKey = rootName != null ? rootName.value() : "mObject"; gen.writeStartObject(); gen.writeObjectField(fieldKey, data); gen.writeEndObject(); } }
然后给你的ResponseWrapper<T>类加上@JsonSerialize注解指定这个序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonSerialize(using = ResponseWrapperSerializer.class) public class ResponseWrapper<T> { private T mObject; public T getmObject() { return mObject; } public void setData(T mObject) { this.mObject = mObject; } }
这样当你序列化ResponseWrapper<Dog>时,就会自动读取Dog类上的@JsonRootName("dog")作为键,输出你期望的{"dog": {"dogId": 19}}。
方案二:利用Jackson的根节点包装配置(适合全局场景)
如果你希望全局启用根节点包装,同时调整ResponseWrapper的结构,可以这样做:
- 给
ObjectMapper启用WRAP_ROOT_VALUE特性:
ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
- 修改
ResponseWrapper,去掉自己的包装逻辑,让Jackson来处理根节点:
public class ResponseWrapper<T> { // 注意这里不需要自己包装对象,直接返回T类型 private T data; public T getData() { return data; } public void setData(T data) { this.data = data; } }
不过这个方案的前提是你所有的返回类都有@JsonRootName注解,而且全局都需要根节点包装,灵活性不如方案一。
内容的提问来源于stack exchange,提问作者Udayaditya Barua
相关产品推荐
相关产品推荐

