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

如何用Lombok指定JSON序列化与反序列化的不同字段名(无需显式写Getter/Setter)

答案:完全可以实现!

你想要的效果——JSON反序列化时用CDO_Name__c映射到POJO的chiefDataOfficerName字段,而序列化时输出原字段名chiefDataOfficerName——完全可以通过Lombok的@Getter/@Setter配合Jackson的注解来实现,不需要手写Getter/Setter方法。

下面给你两种常用的实现方式:


方式一:利用@JsonProperty的access属性直接配置字段

这种方式最简洁,直接在字段上通过@JsonProperty指定反序列化的字段名,并限制其仅用于写入(反序列化),Lombok的@Getter负责生成序列化用的Getter方法:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonProperty.Access;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class PrivacySettings {
    // 反序列化时接受JSON里的"CDO_Name__c",序列化时输出"chiefDataOfficerName"
    @JsonProperty(value = "CDO_Name__c", access = Access.WRITE_ONLY)
    private String chiefDataOfficerName;
}

原理说明:

  • access = Access.WRITE_ONLY告诉Jackson:这个@JsonProperty仅用于反序列化(写入字段),序列化(读取字段)时忽略这个配置,转而使用Getter方法对应的字段名(即chiefDataOfficerName)。
  • Lombok的@Getter自动生成getChiefDataOfficerName()方法,Jackson序列化时会将其转换为驼峰式的字段名chiefDataOfficerName输出。

方式二:给Lombok生成的Setter方法单独加@JsonProperty

如果你更希望精确控制Setter的注解(比如不想修改字段的注解配置),可以通过Lombok的onMethod_属性,给自动生成的Setter方法添加@JsonProperty:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

@Getter
public class PrivacySettings {
    private String chiefDataOfficerName;

    // Lombok生成的setChiefDataOfficerName()方法会自动带上@JsonProperty("CDO_Name__c")
    @Setter(onMethod_ = {@JsonProperty("CDO_Name__c")})
    private void setChiefDataOfficerName(String chiefDataOfficerName) {
        this.chiefDataOfficerName = chiefDataOfficerName;
        // 这里可以保留自定义逻辑,如果不需要的话,甚至可以完全删掉方法体,只留注解
    }
}

原理说明:

  • @Setter(onMethod_ = {@JsonProperty("CDO_Name__c")})会让Lombok在生成Setter方法时,自动将指定的注解添加到方法上,效果和你手写带@JsonProperty的Setter完全一致。
  • 如果你不需要在Setter里写自定义逻辑,可以直接把方法体删掉,只保留字段和注解:
    @Getter
    public class PrivacySettings {
        private String chiefDataOfficerName;
    
        @Setter(onMethod_ = {@JsonProperty("CDO_Name__c")})
        private void setChiefDataOfficerName(String chiefDataOfficerName);
    }
    
    Lombok依然会帮你生成完整的Setter方法并带上注解。

验证效果

不管用哪种方式,测试下来的效果都会符合你的需求:

  • 反序列化:当传入{"CDO_Name__c": "John Doe"}时,Jackson会正确将值赋值给chiefDataOfficerName字段。
  • 序列化:当把PrivacySettings对象转为JSON时,输出的是{"chiefDataOfficerName": "John Doe"},而不是CDO_Name__c。

内容的提问来源于stack exchange,提问作者rimsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:27:10