Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธี Serialize และ Deserialize JSON ด้วย ExclusionStrategy Interface ใน Java (Gson)

อินเทอร์เฟซ ExclusionStrategy ใช้สำหรับ exclude ฟิลด์ใดๆ ระหว่าง serialization และ deserialization เราสามารถให้ custom implementation ของ ExclusionStrategy และลงทะเบียนกับ GsonBuilder ผ่านเมธอด setExclusionStrategies() เมธอดนี้ตั้งค่าให้ Gson ใช้ชุด exclusion strategies ระหว่าง serialize และ deserialize

Syntax

public GsonBuilder setExclusionStrategies(ExclusionStrategy... strategies)

ตัวอย่างการใช้งาน

import com.google.gson.*;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;

public class ExclusionStrategyTest {
    public static void main(String args[]) throws Exception {
        Gson gson = new GsonBuilder()
            .setExclusionStrategies(new CustomExclusionStrategy())
            .create();
        
        Person person = new Person();
        person.setFirstName("Adithya");
        person.setLastName("Sai");
        person.setAddress("Hyderabad");
        
        String jsonString = gson.toJson(person);
        System.out.println("Serialize a JSON: \n" + jsonString);
        
        String inputJson = "{\"firstName\":\"Raja\", \"lastName\":\"Ramesh\", \"address\":\"Hyderabad\"}";
        person = gson.fromJson(inputJson, Person.class);
        System.out.println("Deserialize a JSON:\n" + person);
    }
}

// CustomExclusionStrategy class
class CustomExclusionStrategy implements ExclusionStrategy {
    public boolean shouldSkipField(FieldAttributes f) {
        if (f.getName().equals("firstName")) {
            return true; // skip this field
        }
        return false;
    }
    
    public boolean shouldSkipClass(Class<?> aClass) {
        return false;
    }
}

// Person class
class Person {
    private String firstName, lastName, address;
    
    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    public String getAddress() { return address; }
    public void setAddress(String address) { this.address = address; }
    
    public String toString() {
        return "Person [" + firstName + " " + lastName + " " + address + "]";
    }
}

ผลลัพธ์ (Output)

Serialize a JSON: {"lastName":"Sai","address":"Hyderabad"}
Deserialize a JSON: Person [null Ramesh Hyderabad]

คำอธิบาย

CustomExclusionStrategy.skipField() คืนค่า true สำหรับฟิลด์ "firstName" ทำให้:

  • Serialization: firstName ไม่ปรากฏใน JSON output
  • Deserialization: firstName ไม่ถูก populate จาก JSON (ค่าเป็น null)

เมธอดของ ExclusionStrategy

  • shouldSkipField(FieldAttributes f) - true = exclude ฟิลด์นี้
  • shouldSkipClass(Class<?> clazz) - true = exclude ทั้งคลาสนี้

กรณีการใช้งาน (Use Cases)

  • Field-level exclusion - ตัดฟิลด์เฉพาะ (เช่น password, internal fields)
  • Class-level exclusion - ตัดทั้งคลาส (เช่น sensitive entities)
  • Conditional exclusion - ตัดตาม annotation, modifier, หรือชื่อฟิลด์
  • Different strategies for serialize vs deserialize - ใช้ strategy แยกกันได้

Advanced: แยก Strategy สำหรับ Serialize/Deserialize

Gson gson = new GsonBuilder()
    .addSerializationExclusionStrategy(serializeStrategy)
    .addDeserializationExclusionStrategy(deserializeStrategy)
    .create();

สรุป

ExclusionStrategy ให้การควบคุมการ include/exclude ฟิลด์และคลาสอย่างยืดหยุ่นและ reusable ทั้ง serialization และ deserialization เป็นทางเลือกที่ทรงพลังกว่า @Expose หรือ transient