使用 lombok 自定义序列化和反序列化字段名称

rim*_*sky 4 json jackson lombok

有没有办法指定不同的序列化/反序列化 JSON 字段名称,而不必显式写出 getter 和 setter 方法,也许使用 lombok getter 和 setter?

与此示例类似,以下代码允许将传入的 JSON 反序列化为不同的 POJO 字段名称。它还导致 POJO 字段名称按原样序列化:

public class PrivacySettings {
    private String chiefDataOfficerName;

    @JsonProperty("CDO_Name__c")
    private void setChiefDataOfficerName(String chiefDataOfficerName) {
        this.chiefDataOfficerName = chiefDataOfficerName;
    }

    @JsonProperty("chiefDataOfficerName")
    private String getChiefDataOfficerName() {
        return chiefDataOfficerName;
    }
}
Run Code Online (Sandbox Code Playgroud)

这看起来很冗长,但我无法让它与 @Getter 和 @Setter 一起使用。我确实看到 Jackson 支持 @JsonAlias,这在这个特定示例中可能会有所帮助,但我还需要使用不同的名称进行序列化。

看起来这应该很简单,比如:

@Getter
@Setter
public class PrivacySettings {
    @JsonSetter("CDO_Name__c")    
    @JsonGetter("chiefDataOfficerName")    
    private String chiefDataOfficerName;
}    
Run Code Online (Sandbox Code Playgroud)

但这当然是无效的。

cas*_*lin 5

在这种情况下,我特别认为 getter 和 setter 没有任何问题。


但是,如果您想尝试,因为 v0.11.8 Lombok 支持一项实验性功能,可以为生成的 getter 和 setter 添加注释。请参阅文档

要在生成的方法上添加注释,您可以使用onMethod=@__({@AnnotationsHere}); 要将注释放在生成的 setter 方法的唯一参数上,您可以使用onParam=@__({@AnnotationsHere}). 不过要小心!这是一个实验性功能。有关更多详细信息,请参阅onX功能的文档。

此功能的语法取决于 JDK 版本。对于 JDK 8,您将拥有:

public class PrivacySettings {

    @Setter(onMethod_ = { @JsonSetter("CDO_Name__c") })
    @Getter(onMethod_ = { @JsonGetter("chiefDataOfficerName") })
    private String chiefDataOfficerName;
}
Run Code Online (Sandbox Code Playgroud)

对于 JDK 7,语法是:

public class PrivacySettings {

    @Setter(onMethod = @__({ @JsonSetter("CDO_Name__c") }))
    @Getter(onMethod = @__({ @JsonGetter("chiefDataOfficerName") }))
    private String chiefDataOfficerName;        
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看@Getter@Setter文档。另请参阅此答案以了解有关@__().