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 ;
}


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 核心作用是按需控制对象属性的序列化与反序列化,通过指定视图类来筛选参与的属性,实现不同场景下(如公开/管理接口)返回数据的差异化展示,避免冗余数据传输并提升安全性。

该注解的详细使用,请查看下面这篇文章:

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




来源 :https://mp.weixin.qq.com/s/ybfDQbbGxCE95JHS7BRMbA