环境:SpringBoot3.4.2
1. 简介
在 Spring Boot 开发中,使用 JSON 数据进行交互极为频繁,无论是接收前端请求参数,还是将后端数据返回给前端,都离不开 JSON 格式的数据处理。而 Jackson 作为 Spring Boot 默认的 JSON 处理库,在对象与 JSON 的相互转换中提供了非常强大的各种功能。
然而,在实际开发中,并非对象中的所有字段都需要参与序列化(对象转 JSON)或反序列化(JSON 转对象)操作。例如,某些敏感信息如密码字段,出于安全考虑不能暴露在 JSON 中。
为了灵活控制字段在 JSON 转换中的行为,Jackson 提供了多种忽略 JSON 字段的方式。接下来,我们将详细介绍这 5 种实用的忽略 JSON 字段的方法。
2.实战案例
2.1 类级别忽略字段
我们可以使用 @JsonIgnoreProperties 注解并通过指定字段,在类级别忽略特定字段,如下示例:
@JsonIgnoreProperties(value = {"password", "idNo"})
public class User {
private Long id ;
private String name ;
private String password ;
private String idNo ;
private String address ;
}
Controller接口
@GetMapping("/query")
public User query() {
return new User(1L, "Spring Boot实战案例200讲",
"1234567890", "1828381828225677", "四川乌鲁木齐") ;
}
访问该接口,返回结果
忽略了我们配置的:password, idNo 字段。
2.2 字段级别忽略
我们还可以直接通过字段上的 @JsonIgnore 注解来忽略字段,User对象修改如下:
public class User {
private Long id ;
private String name ;
@JsonIgnore
private String password ;
@JsonIgnore
private String idNo ;
private String address ;
}
在需要忽略的字段上添加 @JsonIgnore 注解。
同样访问上面的接口,输出结果一样:
2.3 通过类型忽略所有字段
我们可以使用 @JsonIgnoreType 注解来忽略指定类型的所有字段。如果我们能够控制该类型,那么可以直接在该类上添加此注解:
定义Score类
@JsonIgnoreType
public class Score {
private Long userId ;
private double score ;
}
在该类上我们使用了 @JsonIgnoreType 注解,当序列化时存在该类型的字段时将会被忽略。
修改User类
public class User {
// ...
private Score score ;
}
最终运行结果
2.4 使用Filter过滤字段
该注解用于指示要使用哪个逻辑过滤器来过滤掉被标注类型(类)的属性;此注解通过声明过滤器的ID来建立关联,并且由 ObjectMapper(或其委托对象)根据ID提供匹配的过滤器。要使用的过滤器通常为 PropertyFilter 类型,并通过 ObjectMapper 进行注册。
首先,我们需要自定义 Jackson2ObjectMapperBuilderCustomizer 通过自定义该类注册过滤器,如下示例:
@Component
public class JsonFilterConfig implements Jackson2ObjectMapperBuilderCustomizer {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
.serializeAllExcept("password", "idNo");
FilterProvider filters = new SimpleFilterProvider()
.addFilter("userFilter", theFilter);
builder.filters(filters) ;
}
}
如上代码中,我们自定义一个 userFilter 过滤器,该过滤器会自动的过滤指定的:password,idNo 2个字段。
接下来,修改User类,如下示例:
@JsonFilter("userFilter")
public class User {
private Long id ;
private String name ;
private String password ;
private String idNo ;
private String address ;
private Score score ;
}
在类上使用 @JsonFilter 注解,并且指定了已经注册的过滤器名称 "userFilter"。
最终运行结果
2.5 @JsonView过滤字段
@JsonView 核心作用是按需控制对象属性的序列化与反序列化,通过指定视图类来筛选参与的属性,实现不同场景下(如公开/管理接口)返回数据的差异化展示,避免冗余数据传输并提升安全性。
该注解的详细使用,请查看下面这篇文章:
绝了!Spring Boot凭@JsonView注解,强大到逆天
2.6 自定义序列化器
通过继承 JsonSerializer<T> 实现自定义序列化器,重写 serialize 方法,手动控制字段输出,忽略敏感字段如 password 和 idNo,实现灵活的 JSON 序列化逻辑。
public class UserSerializer extends JsonSerializer<User> {
@Override
public void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeNumberField("id", user.getId());
gen.writeStringField("name", user.getName());
gen.writeStringField("address", user.getAddress());
gen.writeEndObject();
}
}
完全自己控制,输出哪些字段。
修改User类
@JsonSerialize(using = UserSerializer.class)
public class User {
// ...
}
最终运行效果