Trong bài viết Hướng dẫn sử dụng Gson Annotations, chúng ta sử dụng Annotation @Expose để loại trừ một field khỏi quá trình Serialization và Deserialisation . Tuy nhiên, việc sử dụng Annotation đòi hỏi bạn phải thay đổi nội dung mã nguồn của một class, điều này không thể nếu lớp đó được đóng gói thành gói .jar hoặc bạn không có quyền thực hiện điều này. Trong trường hợp này, Gson cung cấp một cách đó là thực hiện tùy chỉnh ExclusionStrategy và đăng ký nó với GsonBuilder.
Interface ExclusionStrategy cung cấp 2 phương thức:
- shouldSkipField() : cung cấp phương thức cho bạn xác định các trường (field) sẽ được loại trừ.
- shouldSkipClass() : cung cấp phương thức cho bạn xác định class sẽ được loại trừ.
Hãy xem lớp User sau:
package com.gpcoder.gson.object; public class User { private String userName; private String password; private String email; }
Chúng ta cần chuyển thông tin User sang chuỗi Json và mong muốn loại trừ thông tin password ra khỏi chuỗi json.
package com.gpcoder.gson.exclude; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.gpcoder.gson.object.User; public class CustomExclusionStrategy implements ExclusionStrategy { @Override public boolean shouldSkipField(FieldAttributes f) { // true if the field should be ignored; otherwise false return (f.getDeclaringClass() == User.class && f.getName().equals("password")); } @Override public boolean shouldSkipClass(Class<?> clazz) { // true if the class should be ignored; otherwise false return false; } }
Đăng ký tùy chỉnh ExclusionStrategy với GsonBuilder như sau:
package com.gpcoder.gson.exclude; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.gpcoder.gson.object.User; public class CustomExclusionStrategyExample { public static void main(String args[]) { Gson gson = new GsonBuilder() .setExclusionStrategies(new CustomExclusionStrategy()) .setPrettyPrinting() .create(); User user = new User(); user.setUserName("gpcoder.com"); user.setPassword("123"); user.setEmail("gpcodervn@gmail.com"); // Serialize String jsonString = gson.toJson(user); System.out.println("JSON : " + jsonString); // Deserialize String inputJson = "{\"userName\":\"gpcoder.com\",\"password\":\"123\",\"email\":\"gpcodervn@gmail.com\"}"; user = gson.fromJson(inputJson, User.class); System.out.println("Java Object : " + user); } }
Kết quả thực thi chương trình trên:
JSON : { "userName": "gpcoder.com", "email": "gpcodervn@gmail.com" } Java Object : User [userName=gpcoder.com, password=null, email=gpcodervn@gmail.com]
Như bạn thấy, trường password đã được loại trừ trong quá trình chuyển từ đối tượng Java sang chuỗi JSON và từ chuỗi JSON sang đối tượng Java.