Thư viện Gson cung cấp cách chỉ định custom serializer bằng cách đăng ký custom serializer với GsonBuilder khi cần chuyển đối tượng Java sang JSON. Tạo custom serializer bằng cách override phương thức serialize() của lớp com.google.gson.JsonSerializer.
Ví dụ minh họa
import java.lang.reflect.Type;
import com.google.gson.*;
public class CustomJSONSerializerTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Password.class, new PasswordSerializer())
.setPrettyPrinting()
.create();
Student student = new Student("Adithya", "Jai", 25, "Chennai");
student.setPassword(new Password("admin@123"));
System.out.println(gson.toJson(student));
}
}
class PasswordSerializer implements JsonSerializer<Password> {
@Override
public JsonElement serialize(Password src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(new StringBuffer(src.getPassword()).toString());
}
}
// Lớp Student
class Student {
private String firstName;
private String lastName;
private int age;
private String address;
private Password password;
public Student(String firstName, String lastName, int age, String address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.address = address;
}
// getters/setters...
public Password getPassword() { return password; }
public void setPassword(Password password) { this.password = password; }
public String toString() {
return "Student[ firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", address=" + address + " ]";
}
}
// Lớp Password
class Password {
private String password;
public Password(String password) { this.password = password; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
Kết quả đầu ra
{
"firstName": "Adithya",
"lastName": "Jai",
"age": 25,
"address": "Chennai",
"password": "admin@123"
}
Giải thích: Mặc định Gson serialize Password object thành nested object {"password":"admin@123"}. Custom serializer cho phép flatten thành string trực tiếp. Đăng ký qua registerTypeAdapter(Password.class, new PasswordSerializer()).