Spring Boot 忽略 JSON 字段的 6 种终极方案

发布于:2025-07-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

环境: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类

​​​​​

@JsonIgnoreTypepublic 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 通过自定义该类注册过滤器,如下示例:

@Componentpublic 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 {  // ...}

最终运行效果

图片