Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Serialize/Deserialize JSON với ExclusionStrategy interface (Gson)

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 check f.getAnnotation(Internal.class) != null.
  • Exclude by type: shouldSkipClass() return true cho class cụ thể (VD: exclude tất cả Password class).
  • 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.