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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 04:06:07