You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类内部实现自定义Jackson JSON序列化?

Jackson自定义类自身序列化的方案

Jackson不支持你示例中直接在类内部用@JsonSerializer注解标记序列化方法的方式,但提供了两种更简洁的方案,让类自身控制JSON序列化逻辑,无需单独创建外部序列化器类:

方案1:实现JsonSerializable接口

这是Jackson官方推荐的让类自主控制序列化的方式,只需实现接口的两个方法即可:

public class MyClass implements JsonSerializable {
    private int fieldA;
    private String fieldB;

    @Override
    public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 自定义序列化逻辑
        gen.writeStartObject();
        gen.writeNumberField("fieldA", fieldA);
        gen.writeStringField("fieldB", fieldB);
        // 可添加额外字段或自定义格式
        gen.writeEndObject();
    }

    @Override
    public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
        // 处理多态类型序列化的逻辑,无需多态可按示例实现默认逻辑
        typeSer.writeTypePrefixForObject(this, gen);
        serialize(gen, serializers);
        typeSer.writeTypeSuffixForObject(this, gen);
    }
}

方案2:使用@JsonSerialize指定内部静态序列化器

如果不想实现接口,可以在类内部定义静态序列化器类,通过注解绑定到当前类:

@JsonSerialize(using = MyClass.MySerializer.class)
public class MyClass {
    private int fieldA;
    private String fieldB;

    // 内部静态序列化器,与业务类耦合更紧密
    public static class MySerializer extends JsonSerializer<MyClass> {
        @Override
        public void serialize(MyClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStartObject();
            gen.writeNumberField("fieldA", value.fieldA);
            gen.writeStringField("fieldB", value.fieldB);
            gen.writeEndObject();
        }
    }
}

以上两种方案都能实现你想要的“序列化逻辑与类本身关联”的需求,比单独创建外部JsonSerializer子类更简洁。

内容的提问来源于stack exchange,提问作者f.khantsis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:30:16