Khi cần kiểm soát hoàn toàn format JSON output, triển khai StdSerializer<T> và đăng ký qua SimpleModule.
Các bước
- Extends
StdSerializer<YourClass> - Override
serialize(T value, JsonGenerator gen, SerializerProvider provider) - Dùng
JsonGeneratorghi JSON tùy ý - Đăng ký module vào
ObjectMapper
Ví dụ: Serialize User thành JSON phẳng (flatten)
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import java.io.IOException;
public class CustomSerializerDemo {
public static void main(String[] args) throws Exception {
User user = new User();
user.setFirstName("An");
user.setLastName("Nguyễn");
user.setEmail("an.nguyen@example.com");
user.setPhone("0909123456");
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new UserSerializer());
mapper.registerModule(module);
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
System.out.println(json);
}
}
// Domain class
class User {
private String firstName, lastName, email, phone;
// getters/setters...
public String getFirstName() { return firstName; }
public void setFirstName(String fn) { firstName = fn; }
public String getLastName() { return lastName; }
public void setLastName(String ln) { lastName = ln; }
public String getEmail() { return email; }
public void setEmail(String e) { email = e; }
public String getPhone() { return phone; }
public void setPhone(String p) { phone = p; }
}
// Custom Serializer
class UserSerializer extends StdSerializer<User> {
public UserSerializer() { super(User.class); }
@Override
public void serialize(User u, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeStringField("fullName", u.getFirstName() + " " + u.getLastName());
gen.writeStringField("contact", u.getEmail() + " | " + u.getPhone());
gen.writeEndObject();
}
}
Kết quả
{
"fullName" : "An Nguyễn",
"contact" : "an.nguyen@example.com | 0909123456"
}
Khi nào dùng Custom Serializer?
- Format JSON khác hẳn cấu trúc object (flatten, merge field, computed field)
- Serialize interface/abstract class
- Tương thích API cũ (legacy format)
- Hiệu năng cao (tránh reflection)
Đối tác: Custom Deserializer
Tương tự extends StdDeserializer<T> override deserialize(JsonParser, DeserializationContext).