Excluding Fields in Gson
Bài đăng này đã không được cập nhật trong 6 năm
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