李锋镝的博客

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

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

2026年3月19日 约 961 字4 分钟 366点热度 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

推荐阅读

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

岁月同一天 7 月 20 日

回望过去的今天,你在写什么

  • 7 年前 2019年7月20日
    SpringBoot基于redis的分布式锁的实现(源码)

    分布式锁有很多种实现方式,下面是用redis实现的一个比较简单实用的方式。源码如下: import org.spring…

相关文章
  • mybatis-plus-join-boot-starter介绍及用法2025年4月24日
  • 设计模式总结2019年12月13日
  • JVM参数中的-D是什么意思2025年6月23日
  • SpringBoot启动概述(SpringBoot2.1.7)2020年1月10日
  • 从零搭建Spring Cloud Gateway网关(一)2020年3月18日

李锋镝

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

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

文章评论

还没有评论,快来抢沙发吧~

报君黄金台上意,提携玉龙为君死!

听点儿音乐吧 朋友~
文章目录

那年今日(07月20日)

  • 1999年:中国在西藏找到石油
  • 1973年:国际著名动作电影明星李小龙去世
  • 1926年:前苏联著名国务和党务活动家捷尔任斯基逝世
  • 1866年:德国著名数学家黎曼去世
  • 1822年:奥地利近代遗传学的奠基者孟德尔出生
  • 更多历史事件
最新 热点 随机
最新 热点 随机
增加了两套复古皮肤-牛皮纸、千禧网页 Claude Design介绍与使用 Kratos+主题新功能介绍 Taste Skill 说明与使用 jasypt-spring-boot 使用说明 Kratos+主题新功能预览及功能演示
AI时代,个人技术博客的出路在哪里?这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件千万级大表新增字段实战指南:告别锁表与业务中断
如何形象的描述反应式编程中的背压(Backpressure)机制? WordPress评论框增加自定义表情 HBASE填坑日志 JVM安全点介绍 深度解析 RAG 技术:从原理到落地,构建高精度检索增强生成系统 SpringBoot常用注解
最近评论
皮皮社长 发布于 3 天前(07月17日) 李哥你这也太复古了点吧, :37: 你这主题排版得好,我的主题不行,主要是不懂代码,都是ai搞的。
李锋镝 发布于 6 天前(07月14日) 外面的主题功能差异化比较大,部分功能没有还得通过插件来实现,这样样式也不统一,而且经常有爆出风险、漏...
瓦匠 发布于 6 天前(07月14日) 很奈斯啊,都在设计属于自己的主题了,羡慕了
rxshc 发布于 1 周前(07月13日) 工具看着挺实用的。
李锋镝 发布于 2 周前(07月09日) https://github.com/Leonxlnx/taste-skill
标签聚合
SQL 架构 设计模式 Spring Redis WordPress K8s MySQL 日常 ElasticSearch 多线程 IDEA AI JAVA JVM 分布式 数据库 MCP SpringBoot AI编程
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号