使用Jackson序列化时如何为字段加前缀 实现id字段拼接类名前缀需求
实现方案
Jackson实现该需求最常用的有两种方案,按需选择即可:
方案一:自定义通用序列化器(推荐)
该方案复用性强,后续所有需要给id拼接类名前缀的类都可以直接使用,无需重复写逻辑。
步骤1:定义专属序列化注解
import com.fasterxml.jackson.annotation.JacksonAnnotation; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.lang.annotation.*; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotation @JsonSerialize(using = ClassPrefixIdSerializer.class) public @interface ClassPrefixId { }
步骤2:实现序列化逻辑
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 ClassPrefixIdSerializer extends StdSerializer<Object> { public ClassPrefixIdSerializer() { super(Object.class); } @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 空值直接返回,避免空指针 if (value == null) { gen.writeNull(); return; } // 获取当前序列化的对象实例 Object currentObj = gen.getCurrentValue(); // 取类名并将首字母转为小写,生成前缀 String className = currentObj.getClass().getSimpleName(); String prefix = Character.toLowerCase(className.charAt(0)) + className.substring(1); // 拼接后输出字符串 gen.writeString(prefix + "-" + value); } }
步骤3:给目标字段加注解
public class CarClass { @ClassPrefixId public Long id; public String name; // 构造方法、其他属性省略 }
直接序列化对象即可得到你需要的输出结果。
方案二:重写Getter方法(轻量化实现)
如果只需要给单个类做适配,不需要通用能力,可以用这个快速实现:
import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonIgnore; public class CarClass { public Long id; public String name; // 忽略原有id字段的序列化 @JsonIgnore public Long getId() { return id; } // 自定义id字段的序列化返回值 @JsonGetter("id") public String getPrefixedId() { if (id == null) return null; return "carClass-" + id; } }
注意事项
- 如果需要调整前缀的格式(比如全小写、下划线分隔类名等),只需修改序列化逻辑中
prefix的生成规则即可 - 两种方案都不需要修改原有业务逻辑,对业务代码侵入性低
内容的提问来源于stack exchange,提问作者Ebsan
相关产品推荐
相关产品推荐

