要让Jackson直接使用类的字段(Field) 进行序列化和反序列化,而非默认的getter/setter方法,核心是修改Jackson的属性访问策略:关闭对getter/isGetter/setter的自动检测,开启对所有字段(无论访问修饰符)的检测。
下面分通用Java项目、Spring Boot项目、局部类注解三种场景,提供最实用的配置方案。
核心原理
Jackson默认通过以下规则映射属性:
- 序列化:找
getXxx()/isXxx()方法 - 反序列化:找
setXxx()方法
我们需要修改ObjectMapper的可见性配置:
- 禁用:
GETTER/IS_GETTER/SETTER的检测 - 启用:
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;}
}
总结
- 全局推荐:通用项目用
ObjectMapper手动配置,Spring Boot用@Bean自定义ObjectMapper; - 局部场景:单个类用
@JsonAutoDetect,单个字段用@JsonProperty; - 核心配置:
FIELD设为ANY,GETTER/IS_GETTER/SETTER设为NONE。
配置后,Jackson会完全跳过getter/setter,直接读写类的字段(包括私有字段)。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
文章评论