李锋镝的博客

  • 首页
  • 时间轴
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
    • 博友圈
  • 说说
  • 走心评论
  • 互动榜
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

配置Jackson使用字段而不是getter/setter来序列化和反序列化

2026年3月19日 310点热度 0人点赞 0条评论

要让Jackson直接使用类的字段(Field) 进行序列化和反序列化,而非默认的getter/setter方法,核心是修改Jackson的属性访问策略:关闭对getter/isGetter/setter的自动检测,开启对所有字段(无论访问修饰符)的检测。

下面分通用Java项目、Spring Boot项目、局部类注解三种场景,提供最实用的配置方案。


核心原理

Jackson默认通过以下规则映射属性:

  • 序列化:找getXxx()/isXxx()方法
  • 反序列化:找setXxx()方法

我们需要修改ObjectMapper的可见性配置:

  1. 禁用:GETTER/IS_GETTER/SETTER的检测
  2. 启用:FIELD(字段)的检测,并设置可见性为ANY(支持private/protected/public所有字段)

方式1:通用Java项目(全局配置)

直接手动配置ObjectMapper,全局生效,无需依赖框架。

步骤1:配置ObjectMapper

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonFieldConfig {
    public static ObjectMapper getObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();

        // 1. 禁用getter方法检测(序列化默认用getter)
        objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
        // 2. 禁用布尔类型isGetter检测(如isAdult())
        objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
        // 3. 禁用setter方法检测(反序列化默认用setter)
        objectMapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
        // 4. 启用字段检测,所有访问修饰符的字段都可见
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

        return objectMapper;
    }
}

步骤2:测试实体类(无getter/setter)

// 无任何getter/setter,仅私有字段
public class User {
    // 私有字段,Jackson直接访问
    private String username;
    private int age;
    private boolean isStudent;

    // Jackson必须有无参构造器(默认省略,显式写更稳妥)
    public User() {}

    // 测试用构造器
    public User(String username, int age, boolean isStudent) {
        this.username = username;
        this.age = age;
        this.isStudent = isStudent;
    }
}

步骤3:序列化/反序列化测试

public class Test {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = JacksonFieldConfig.getObjectMapper();

        // 1. 序列化(字段 → JSON)
        User user = new User("张三", 20, true);
        String json = mapper.writeValueAsString(user);
        System.out.println(json); 
        // 输出:{"username":"张三","age":20,"isStudent":true}

        // 2. 反序列化(JSON → 字段)
        User user2 = mapper.readValue(json, User.class);
        System.out.println(user2.username); // 张三
        System.out.println(user2.isStudent); // true
    }
}

方式2:Spring Boot项目(全局自动配置)

Spring Boot默认自动装配ObjectMapper,只需自定义Bean覆盖默认配置,全局生效。

步骤1:创建Jackson配置类

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {
    /**
     * 自定义全局ObjectMapper,使用字段而非getter/setter
     */
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();

        // 同通用配置,禁用方法检测,启用字段检测
        objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
        objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

        return objectMapper;
    }
}

配置后,Spring所有场景(@ResponseBody、Redis序列化、接口参数)都会直接用字段处理JSON。


方式3:局部类注解(仅单个类生效)

如果只需要某个类用字段,其他类仍用getter/setter,直接在类上添加@JsonAutoDetect注解即可,无需全局配置。

import com.fasterxml.jackson.annotation.JsonAutoDetect;

// 仅当前类使用字段序列化/反序列化
@JsonAutoDetect(
    fieldVisibility = JsonAutoDetect.Visibility.ANY,       // 字段可见
    getterVisibility = JsonAutoDetect.Visibility.NONE,     // 禁用getter
    isGetterVisibility = JsonAutoDetect.Visibility.NONE,  // 禁用isGetter
    setterVisibility = JsonAutoDetect.Visibility.NONE      // 禁用setter
)
public class Product {
    private Long id;
    private String productName;
    private double price;

    // 无getter/setter
    public Product() {}
}

方式4:字段级注解(仅单个字段生效)

如果只需要个别字段用字段访问,其余仍用getter/setter,给目标字段加@JsonProperty即可。

import com.fasterxml.jackson.annotation.JsonProperty;

public class Order {
    // 强制用字段序列化/反序列化
    @JsonProperty
    private String orderNo;

    // 仍用getter/setter
    private Integer amount;

    // getter/setter
    public Integer getAmount() {return amount;}
    public void setAmount(Integer amount) {this.amount = amount;}
}

总结

  1. 全局推荐:通用项目用ObjectMapper手动配置,Spring Boot用@Bean自定义ObjectMapper;
  2. 局部场景:单个类用@JsonAutoDetect,单个字段用@JsonProperty;
  3. 核心配置:FIELD设为ANY,GETTER/IS_GETTER/SETTER设为NONE。

配置后,Jackson会完全跳过getter/setter,直接读写类的字段(包括私有字段)。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/hou-duan/4694

相关文章

  • JDK25模块级导入深度解析:Java导入机制的革命性进化
  • 数据库更新如何实现乐观锁
  • try...catch性能深度剖析:从JVM原理到实战优化,打破技术迷思
  • Spring WebFlux深度解析:异步非阻塞架构与实战落地指南
  • Java进阶实战:10个高效技巧+环境管理指南,让代码简洁又优雅
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: Jackson JAVA
最后更新:2026年3月19日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

秋天是倒放的春天,晚安是爱你的序篇。

那年今日(07月03日)

  • 2005年:西班牙正式通过同性婚姻相关法案
  • 1969年:英国滚石乐队的创始团员布莱恩·琼斯去世
  • 1876年:中国第一条铁路淞沪铁路正式通车运营
  • 1518年:中国明代医学家兼药物学家李时珍出生
  • 1062年:中国北宋官员包拯去世
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Kratos+主题新功能预览及功能演示 SpringBoot DeferredLog 完整详解 LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务
AI时代,个人技术博客的出路在哪里?这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件千万级大表新增字段实战指南:告别锁表与业务中断
Auld Lang Syne 缓存架构实战指南:6大核心缓存技术深度解析与落地方案 阿里巴巴的26款超神Java开源项目 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 岁末 海琴烟~~~
最近评论
李锋镝 发布于 4 天前(06月30日) 目前是每天一换,一个星期不重样 :41:
不凡 发布于 4 天前(06月29日) 主题配色挺好看。 :2:
李锋镝 发布于 5 天前(06月29日) 已经更新了~
懋和道人 发布于 5 天前(06月29日) 境外与附件不能访问,其他都是正常的,如果不正常可以通过更换ip访问。
李锋镝 发布于 5 天前(06月29日) 403呀道长
标签聚合
SQL 多线程 日常 IDEA 数据库 ElasticSearch Spring AI编程 JVM JAVA SpringBoot MCP 分布式 MySQL docker AI 架构 K8s Redis WordPress
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号