Java中如何根据type字段动态调整ResponseData的value字段泛型类型
实现方案
以下提供两种适配不同场景的实现方式:
方案一:自定义Jackson序列化器(无需修改原有类字段定义)
该方案适配你当前的ResponseData类结构,仅新增序列化逻辑即可满足输出要求,SpringBoot等默认使用Jackson做JSON序列化的框架可直接使用:
- 编写
ResponseData专属序列化器
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; public class ResponseDataSerializer extends StdSerializer<ResponseData> { public ResponseDataSerializer() { super(ResponseData.class); } @Override public void serialize(ResponseData data, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); // 输出固定类型字段 gen.writeNumberField("entityId", data.getEntityId()); gen.writeStringField("type", data.getType()); // 按type动态处理value的输出类型 String type = data.getType(); if ("Integer".equals(type) || "Reference".equals(type)) { gen.writeFieldName("value"); gen.writeStartArray(); for (String val : data.getValue()) { // 可根据业务需求增加数字格式异常捕获逻辑 gen.writeNumber(Integer.parseInt(val)); } gen.writeEndArray(); } else { gen.writeObjectField("value", data.getValue()); } gen.writeEndObject(); } }
- 给原有
ResponseData类绑定序列化器,补全getter/setter
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.List; @JsonSerialize(using = ResponseDataSerializer.class) public class ResponseData { private Long entityId; private String type; private List<String> value; // 必须补全以下getter/setter,否则序列化器无法读取字段值 public Long getEntityId() { return entityId; } public void setEntityId(Long entityId) { this.entityId = entityId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public List<String> getValue() { return value; } public void setValue(List<String> value) { this.value = value; } }
序列化后的输出效果:
- type为Integer/Reference时,value输出数字数组:
"value": [1,2,3] - 其余type时,value输出字符串数组:
"value": ["a","b","c"]
方案二:修改字段类型(适配业务赋值逻辑可控的场景)
如果可以调整原有类的字段定义,直接把value改为List<Object>类型,赋值时按type存入对应类型的元素,Jackson序列化会自动输出正确的类型,无需自定义序列化逻辑:
public class ResponseData { private Long entityId; private String type; private List<Object> value; // getter/setter省略 }
使用规则:
- type为Integer/Reference时,value集合内直接存入Integer类型对象
- 其余type时,value集合内存入String类型对象
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

