如何用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里写自定义逻辑,可以直接把方法体删掉,只保留字段和注解:
Lombok依然会帮你生成完整的Setter方法并带上注解。@Getter public class PrivacySettings { private String chiefDataOfficerName; @Setter(onMethod_ = {@JsonProperty("CDO_Name__c")}) private void setChiefDataOfficerName(String chiefDataOfficerName); }
验证效果
不管用哪种方式,测试下来的效果都会符合你的需求:
- 反序列化:当传入
{"CDO_Name__c": "John Doe"}时,Jackson会正确将值赋值给chiefDataOfficerName字段。 - 序列化:当把
PrivacySettings对象转为JSON时,输出的是{"chiefDataOfficerName": "John Doe"},而不是CDO_Name__c。
内容的提问来源于stack exchange,提问作者rimsky
相关产品推荐
相关产品推荐

