如何在类内部实现自定义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
相关产品推荐
相关产品推荐

