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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:12:41