Excluding Fields in Gson

Thông thường khi làm việc với Gson(https://github.com/google/gson), chúng ta sẽ tạo ra các object tương ứng với json data. Các quá trình serialization/deserialization sẽ sử dụng các field trong object để tạo ra json string hoặc từ json tạo ra object tương ứng. Trong một số trường hợp, một số field không cần thiết thường chúng ta sẽ muốn loại bỏ nó ra khỏi quá trình serialization/deserialization. Có một số cách để thực hiện việc đó.

1. Sử dụng Java Modifier

Mặc định thì nếu khai báo với từ khóa transient thì field đó sẽ bị loại bỏ. Ngoài ra có thể sử dụng GsonBuilder để thiết lập loại bỏ các Modifier khác, chẳng hạn :

Gson gson = new GsonBuilder()
                .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.VOLATILE)
                .create();

2. Sử dụng @Expose Annotations

Khi sử dụng @Expose, bạn có thể chỉ định exclude cho quá trình serialization hoặc deserialization hoặc cả 2 (mặc định là cả 2). Để sử dụng thì trước tiên phải dùng 1 GsonBuilder như sau :

Gson gson = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .create();

Chú ý khi dùng thế này thì Gson sẽ bỏ qua tất cả những field không có @Expose.

public class Person {
    @Expose
    private int id;
    @Expose(serialize = true, deserialize = false)
    private String name;
    @Expose(serialize = true, deserialize = true)
    private String gender;
    @Expose(serialize = false, deserialize = false)
    private double money;
    private List<Person> friends;
}

3. Sử dụng ExclusionStrategy

Có thể sử dụng ExclusionStrategy cùng với các hàm setExclusionStrategies, addSerializationExclusionStrategy, addDeserializationExclusionStrategy khi tạo GsonBuilder để tạo ra chính xác những gì bạn muốn.

GsonBuilder builder = new GsonBuilder();
        builder.setExclusionStrategies(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes fieldAttributes) {
                if("privateValue".equals(fieldAttributes.getName()) || 
                fieldAttributes.hasModifier(Modifier.PRIVATE)){
                    return true;
                }
                return false;
            }

            @Override
            public boolean shouldSkipClass(Class<?> aClass) {
                return false;
            }
        });
        Gson gson = builder.create();

4. Use Version

Để sử dụng, thì ở mỗi field sẽ cần set annotation @Since

public class Person {
    @Since(1.0)
    private int id;
    private String name;
    @Since(3.0)
    private String gender;
    @Since(4.0)
    private double money;
    @Since(5.0)
    private List<Person> friends;

    public Person(int id, String name, String gender, double money, List<Person> friends) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.money = money;
        this.friends = friends;
    }
}

Sau đó set version cho gson: Gson gson = new GsonBuilder().setVersion(3.0).create(); Test:

Person person = new Person(1, "Mot", "Undefined", 0, null);
System.out.println(gson.toJson(person);

Kết quả: {"gender":"Undefined","id":1,"name":"Mot"} Những field có version cao hơn version được set sẽ bị loại bỏ. Quá trình deserialization cũng tương tự như vậy.

5. Null Fields

Mặc định thì những trường null thì Gson sẽ loại bỏ nó trong quá trình serialization, tuy nhiên có thể giữ lại bằng cách Gson gson = new GsonBuilder().serializeNulls().create(); Test:

public class Person {
    private int id;
    private String name;
    private String gender;
    private double money;
    private List<Person> friends;

    public Person(int id, String name, String gender, double money, List<Person> friends) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.money = money;
        this.friends = friends;
    }
}
Person person = new Person(1, "Mot", null, 5, null);
Gson gson = new GsonBuilder().serializeNulls().create();
System.out.println(gson.toJson(person);

Kết quả: {"friends":null,"gender":null,"id":1,"money":5.0,"name":"Mot"}


All Rights Reserved