Interface ExclusionStrategy cho phép exclude field/class tùy chỉnh khi serialize/deserialize Gson. Đăng ký qua GsonBuilder.setExclusionStrategies().
Cú pháp
public GsonBuilder setExclusionStrategies(ExclusionStrategy... strategies)
Ví dụ: Exclude field "firstName"
import com.google.gson.*;
import com.google.gson.annotations.*;
public class ExclusionStrategyTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.setExclusionStrategies(new CustomExclusionStrategy())
.create();
// Serialize
Person person = new Person();
person.setFirstName("Adithya");
person.setLastName("Sai");
person.setAddress("Hyderabad");
String json = gson.toJson(person);
System.out.println("Serialize: " + json);
// Deserialize
String inputJson = "{\"firstName\":\"Raja\",\"lastName\":\"Ramesh\",\"address\":\"Hyderabad\"}";
person = gson.fromJson(inputJson, Person.class);
System.out.println("Deserialize: " + person);
}
}
// Custom ExclusionStrategy
class CustomExclusionStrategy implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return "firstName".equals(f.getName()); // Skip firstName
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false; // Không skip class nào
}
}
class Person {
private String firstName, lastName, address;
// getters/setters...
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String geLastName() { return lastName; } // typo trong source: geLastName
public void setLastName(String lastName) { this.lastName = lastName; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
@Override public String toString() { return "Person[" + firstName + " " + lastName + " " + address + "]"; }
}
Output
Serialize: {"lastName":"Sai","address":"Hyderabad"}
Deserialize: Person[null Ramesh Hyderabad]
Lưu ý: Deserialize firstName thành null vì field bị skip.
Các strategy hữu ích khác
- Exclude by annotation: Tạo annotation custom
@Internal, strategy checkf.getAnnotation(Internal.class) != null. - Exclude by type:
shouldSkipClass()return true cho class cụ thể (VD: exclude tất cảPasswordclass). - Versioning: Kết hợp với @Since/@Until (Gson built-in).
- Conditional: Dựa trên field value, context, v.v.
Best Practice
- Dùng
FieldAttributesđể lấy name, declaring class, annotations. - Strategy được apply cho **cả serialize và deserialize**. Tách strategy nếu cần khác nhau.
- Performance: Strategy được gọi cho mỗi field → tránh logic phức tạp bên trong.
- Jackson equivalent:
@JsonFilter,@JsonView,PropertyFilter.