Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Triển khai Custom Serializer với Jackson (StdSerializer)

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

  1. Extends StdSerializer<YourClass>
  2. Override serialize(T value, JsonGenerator gen, SerializerProvider provider)
  3. Dùng JsonGenerator ghi JSON tùy ý
  4. Đă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).