干掉它!Spring Boot 忽略 JSON 字段的六種終極方案
環(huán)境:SpringBoot3.4.2
1. 簡(jiǎn)介
在 Spring Boot 開(kāi)發(fā)中,使用 JSON 數(shù)據(jù)進(jìn)行交互極為頻繁,無(wú)論是接收前端請(qǐng)求參數(shù),還是將后端數(shù)據(jù)返回給前端,都離不開(kāi) JSON 格式的數(shù)據(jù)處理。而 Jackson 作為 Spring Boot 默認(rèn)的 JSON 處理庫(kù),在對(duì)象與 JSON 的相互轉(zhuǎn)換中提供了非常強(qiáng)大的各種功能。
然而,在實(shí)際開(kāi)發(fā)中,并非對(duì)象中的所有字段都需要參與序列化(對(duì)象轉(zhuǎn) JSON)或反序列化(JSON 轉(zhuǎn)對(duì)象)操作。例如,某些敏感信息如密碼字段,出于安全考慮不能暴露在 JSON 中。
為了靈活控制字段在 JSON 轉(zhuǎn)換中的行為,Jackson 提供了多種忽略 JSON 字段的方式。接下來(lái),我們將詳細(xì)介紹這 5 種實(shí)用的忽略 JSON 字段的方法。
2.實(shí)戰(zhàn)案例
2.1 類(lèi)級(jí)別忽略字段
我們可以使用 @JsonIgnoreProperties 注解并通過(guò)指定字段,在類(lèi)級(jí)別忽略特定字段,如下示例:
@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實(shí)戰(zhàn)案例200講", 
    "1234567890", "1828381828225677", "四川烏魯木齊") ;
}訪問(wèn)該接口,返回結(jié)果

忽略了我們配置的:password, idNo 字段。
2.2 字段級(jí)別忽略
我們還可以直接通過(guò)字段上的 @JsonIgnore 注解來(lái)忽略字段,User對(duì)象修改如下:
public class User {
  private Long id ;
  private String name ;
  @JsonIgnore
  private String password ;
  @JsonIgnore
  private String idNo ;
  private String address ;
}在需要忽略的字段上添加 @JsonIgnore 注解。
同樣訪問(wèn)上面的接口,輸出結(jié)果一樣:
圖片
2.3 通過(guò)類(lèi)型忽略所有字段
我們可以使用 @JsonIgnoreType 注解來(lái)忽略指定類(lèi)型的所有字段。如果我們能夠控制該類(lèi)型,那么可以直接在該類(lèi)上添加此注解:
定義Score類(lèi)
@JsonIgnoreType
public class Score {
  private Long userId ;
  private double score ;
}在該類(lèi)上我們使用了 @JsonIgnoreType 注解,當(dāng)序列化時(shí)存在該類(lèi)型的字段時(shí)將會(huì)被忽略。
修改User類(lèi)
public class User {
  // ...
  private Score score ;
}最終運(yùn)行結(jié)果
圖片
2.4 使用Filter過(guò)濾字段
該注解用于指示要使用哪個(gè)邏輯過(guò)濾器來(lái)過(guò)濾掉被標(biāo)注類(lèi)型(類(lèi))的屬性;此注解通過(guò)聲明過(guò)濾器的ID來(lái)建立關(guān)聯(lián),并且由 ObjectMapper(或其委托對(duì)象)根據(jù)ID提供匹配的過(guò)濾器。要使用的過(guò)濾器通常為 PropertyFilter 類(lèi)型,并通過(guò) ObjectMapper 進(jìn)行注冊(cè)。
首先,我們需要自定義 Jackson2ObjectMapperBuilderCustomizer 通過(guò)自定義該類(lèi)注冊(cè)過(guò)濾器,如下示例:
@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) ;
  }
}如上代碼中,我們自定義一個(gè) userFilter 過(guò)濾器,該過(guò)濾器會(huì)自動(dòng)的過(guò)濾指定的:password,idNo 2個(gè)字段。
接下來(lái),修改User類(lèi),如下示例:
@JsonFilter("userFilter")
public class User {
  private Long id ;
  private String name ;
  private String password ;
  private String idNo ;
  private String address ;
  private Score score ;
}在類(lèi)上使用 @JsonFilter 注解,并且指定了已經(jīng)注冊(cè)的過(guò)濾器名稱(chēng) "userFilter"。
最終運(yùn)行結(jié)果
圖片
2.5 @JsonView過(guò)濾字段
@JsonView 核心作用是按需控制對(duì)象屬性的序列化與反序列化,通過(guò)指定視圖類(lèi)來(lái)篩選參與的屬性,實(shí)現(xiàn)不同場(chǎng)景下(如公開(kāi)/管理接口)返回?cái)?shù)據(jù)的差異化展示,避免冗余數(shù)據(jù)傳輸并提升安全性。
2.6 自定義序列化器
通過(guò)繼承 JsonSerializer<T> 實(shí)現(xiàn)自定義序列化器,重寫(xiě) serialize 方法,手動(dòng)控制字段輸出,忽略敏感字段如 password 和 idNo,實(shí)現(xiàn)靈活的 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類(lèi)
@JsonSerialize(using = UserSerializer.class)
public class User {
  // ...
}最終運(yùn)行效果:
圖片















 
 
 
















 
 
 
 