如何为Jackson同一字段配置读写场景不同的@JsonProperty规则
可行解决方案
方案1:使用@JsonAlias简化配置(推荐,代码改动最小)
@JsonAlias是Jackson 2.9+提供的注解,仅作用于反序列化阶段,允许属性接收指定别名的输入,不会影响序列化阶段的输出字段名,完全匹配你的需求,调整后的Mix-in代码如下:
@JsonDeserialize(converter = StandingSanitizer.class) public abstract class StandingMixIn { // 保留原有配置:反序列化忽略赋值,序列化正常输出 @JsonProperty(access = JsonProperty.Access.READ_ONLY) Integer positionNumber; // 反序列化时可接收 position 字段输入,序列化时正常输出为 positionText @JsonAlias("position") String positionText; }
该方案不用修改其他逻辑,直接替换原有Mix-in即可生效,不需要额外配置。
方案2:拆分Mix-in的方法级注解(兼容低版本Jackson)
如果你使用的Jackson版本低于2.9不支持@JsonAlias,可以通过在Mix-in中模拟对应属性的get/set方法,分别配置读写规则,字段级的注解可以完全移除:
@JsonDeserialize(converter = StandingSanitizer.class) public abstract class StandingMixIn { // -------------------------- positionNumber 配置 -------------------------- // 反序列化时忽略setter赋值 @JsonIgnore public void setPositionNumber(Integer positionNumber) {} // 序列化时正常输出字段 @JsonProperty("positionNumber") public Integer getPositionNumber() { return null; } // -------------------------- positionText 配置 -------------------------- // 反序列化时接收position字段输入 @JsonProperty("position") public void setPositionText(String positionText) {} // 序列化时输出positionText字段 @JsonProperty("positionText") public String getPositionText() { return null; } }
Jackson处理属性读写时会优先匹配get/set方法上的注解,二者配置互不干扰,可完全实现读写阶段不同的字段映射规则。
内容的提问来源于stack exchange,提问作者Marcel Overdijk
相关产品推荐
相关产品推荐

