Jackson反序列化:如何仅反序列化带注解的属性
Jackson配置:仅反序列化带@JsonProperty注解的字段+解决Setter重载冲突
适用于Jackson 2.5.4的方案
- 彻底禁用自动检测特性,强制Jackson仅通过注解识别可处理的属性:
ObjectMapper mapper = new ObjectMapper(); // 关闭所有自动识别字段、setter/getter的逻辑 mapper.disable(MapperFeature.AUTO_DETECT_FIELDS); mapper.disable(MapperFeature.AUTO_DETECT_SETTERS); mapper.disable(MapperFeature.AUTO_DETECT_GETTERS); mapper.disable(MapperFeature.AUTO_DETECT_IS_GETTERS); // 确保仅使用注解处理序列化/反序列化 mapper.enable(MapperFeature.USE_ANNOTATIONS); - 解决
endDt的重载setter冲突:
2.5.x版本的Jackson会扫描所有setter方法,即便字段不在JSON中也会触发冲突报错。不用逐个加@JsonIgnore的话,可给需要保留的setter标记@JsonProperty,未标记的setter会被自动忽略:@JsonProperty public void setEndDt(Date endDt) { this.endDt = endDt; } // 未标记的重载setter会被忽略 public void setEndDt(String endDtStr) { // 自定义逻辑 }
升级到最新Jackson版本(更省心)
新版(2.15+)对注解驱动的支持更完善,配置更简洁,还能自动处理大部分重载setter冲突:
- 配置仅处理带注解的属性:
ObjectMapper mapper = new ObjectMapper(); // 将所有字段、getter/setter的默认可见性设为NONE mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE); // 强制仅通过注解识别可处理的属性 mapper.enable(MapperFeature.USE_ANNOTATIONS); - 重载setter问题:新版Jackson会自动匹配参数类型适配的setter,只要给需要的setter标记
@JsonProperty,基本不会再抛出冲突异常。
补充提示
如果2.5.4版本禁用自动检测后仍有问题,检查是否有其他注解(如@JsonCreator)干扰识别逻辑,确保所有需要反序列化的属性都明确标记了@JsonProperty,未标记的属性及对应方法都会被忽略。
内容的提问来源于stack exchange,提问作者S Hornby
相关产品推荐
相关产品推荐

