jackson自定义序列化器

461 阅读2分钟

@JsonSerialize(using = JsonTypeSerializer.class) 是 Jackson 库中的一个注解,用于指定在序列化过程中使用自定义的序列化器(JsonTypeSerializer)。通过这个注解,你可以控制如何将 Java 对象转换为 JSON 数据。

以下是如何使用 @JsonSerialize(using = JsonTypeSerializer.class) 的详细说明和示例。


1. 使用场景

  • 当默认的 Jackson 序列化行为无法满足需求时。
  • 当需要自定义 Java 对象到 JSON 的转换逻辑时。
  • 当需要在序列化过程中进行数据格式化或过滤时。

2. 实现步骤

步骤 1:定义目标类

假设你有一个类 MyClass,你希望使用自定义的序列化器来序列化它。

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

@JsonSerialize(using = JsonTypeSerializer.class) // 指定自定义序列化器
public class MyClass {
    private String name;
    private int value;

    // 必须有无参构造函数
    public MyClass() {}

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "MyClass{name='" + name + "', value=" + value + "}";
    }
}

步骤 2:实现自定义序列化器

创建一个自定义序列化器 JsonTypeSerializer,继承 JsonSerializer<T> 并实现 serialize 方法。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class JsonTypeSerializer extends JsonSerializer<MyClass> {

    @Override
    public void serialize(MyClass myClass, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 开始写入 JSON 对象
        gen.writeStartObject();

        // 写入自定义字段
        gen.writeStringField("name", myClass.getName());
        gen.writeNumberField("value", myClass.getValue());

        // 可以添加额外的逻辑,例如格式化或过滤
        if (myClass.getValue() > 100) {
            gen.writeBooleanField("isLargeValue", true);
        }

        // 结束写入 JSON 对象
        gen.writeEndObject();
    }
}

步骤 3:序列化 Java 对象

使用 Jackson 的 ObjectMapper 将 MyClass 对象序列化为 JSON 字符串。

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        // 创建 MyClass 对象
        MyClass myClass = new MyClass();
        myClass.setName("John");
        myClass.setValue(150);

        // 创建 ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        // 序列化 MyClass 对象为 JSON 字符串
        String json = mapper.writeValueAsString(myClass);

        // 输出结果
        System.out.println(json); // 输出: {"name":"John","value":150,"isLargeValue":true}
    }
}

3. 关键点说明

  1. @JsonSerialize 注解

    • 用于类或字段上,指定自定义序列化器。
    • using 属性指定序列化器的类。
  2. 自定义序列化器

    • 继承 JsonSerializer<T>,其中 T 是目标类型。
    • 实现 serialize 方法,将 Java 对象写入 JsonGenerator
  3. ObjectMapper

    • 是 Jackson 的核心类,用于序列化和反序列化 JSON 数据。
    • 通过 writeValueAsString 方法将 Java 对象转换为 JSON 字符串。

4. 复杂示例:嵌套对象或数组

如果 Java 对象包含嵌套对象或数组,可以在自定义序列化器中进一步处理。

示例 Java 对象

public class MyClass {
    private String name;
    private int value;
    private Details details;

    // Getter 和 Setter 方法
    // ...
}

public class Details {
    private String address;
    private String city;

    // Getter 和 Setter 方法
    // ...
}

自定义序列化器

@Override
public void serialize(MyClass myClass, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    gen.writeStartObject();

    gen.writeStringField("name", myClass.getName());
    gen.writeNumberField("value", myClass.getValue());

    // 序列化嵌套对象
    Details details = myClass.getDetails();
    if (details != null) {
        gen.writeObjectFieldStart("details");
        gen.writeStringField("address", details.getAddress());
        gen.writeStringField("city", details.getCity());
        gen.writeEndObject();
    }

    gen.writeEndObject();
}

5. 总结

  • @JsonSerialize(using = JsonTypeSerializer.class) 是一种强大的工具,用于自定义 Jackson 的序列化行为。
  • 通过实现 JsonSerializer,你可以完全控制如何将 Java 对象映射到 JSON 数据。
  • 适用于处理复杂对象结构、数据格式化或过滤等场景。