李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 赞助
  • 星球穿梭
  • 🚇开往
白雪成红
惟坚韧者始能遂其志
  1. 首页
  2. 后端
  3. 正文

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

2026年3月19日 约 961 字4 分钟 161 0 0
本文最后更新于 2026年3月19日,距今已 197 天,其中的信息可能已经发生变化,请注意甄别。

要让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,直接读写类的字段(包括私有字段)。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

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

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: Jackson JAVA
最后更新:2026年3月19日
相关文章
  • Java设计模式:策略模式2025年5月22日
  • 重构 Controller 终极指南:从臃肿到优雅的 7 大黄金法则 + 实战技巧2025年10月31日
  • 查看占用 CPU 最高的线程(Java)2021年5月27日
  • Java 灵魂拷问 13 个为什么,你都会哪些?2025年5月20日
  • SpringBoot整合GraphQL入门教程2022年1月28日

李锋镝

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

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

文章评论

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

我见青山多妩媚,料青山见我应如是。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Kratos-plus v1.1.26版本更新说明 我觉得是时候公布我的导航网站了 代码是 AI 写的,生产事故谁背锅? 给主题增加了游客中心功能 祝大家中秋安康 游本昌去世
给主题增加了游客中心功能游本昌去世关于主题加载速度优化的一点儿小演进我觉得是时候公布我的导航网站了给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比
用动画解释 TCP 三次握手过程 AI Agent 扩展双雄:MCP 与 Agent Skill 深度拆解——从设计哲学到实战落地 详解 ZooKeeper 数据持久化 HTTP3与QUIC详解 LangChain + Zod 实战指南:构建类型安全的AI结构化输出系统 余秋雨散文集精选
最近评论
fairy 发布于 1 天前(10月02日) 很明显,只能处罚人,当然是人背锅。你能罚AI钱吗?能把AI辞退吗?很明显不能。
彬红茶 发布于 1 天前(10月02日) 很全面哦~国庆快乐
彬红茶 发布于 1 天前(10月01日) 确实可以加一下这个功能,我最近就改了,评论区加了个等级,游客中心实属无能为力 :78:
皮皮社长 发布于 2 天前(10月01日) 快看快看,我皮皮社长上榜了~ :2:
皮皮社长 发布于 2 天前(10月01日) 我直接把喜欢的网站放到友链中就好了,简单明了~ :40:
标签聚合
多线程 IDEA Claude MySQL Redis 数据库 日常 K8s 分布式 SQL SpringBoot ElasticSearch JVM AI AI编程 Theme JAVA WordPress 架构 Spring
友情链接
  • 志文工作室
  • 知向前端
  • 九仞之行
  • 彬红茶日记
  • 瓦匠个人小站
  • 懋和道人
  • Serendipity
  • 若梦博客
  • 韩小韩博客
  • 搬砖日记
  • 林羽凡
  • 临窗旋墨
  • 老张博客
  • 皮皮社
  • 韩情脉脉
  • 蜗牛工作室
  • Honesty
  • 哥斯拉
  • sssr7844的博客
  • Mr.Sun的博客

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号