杰克逊为什么不使用serialize()自定义包装类扩展LinkedHashMap的方法

时间:2014-09-06 09:12:39

标签: java json serialization jackson wrapper

我在Spring MVC项目中使用Jackson 2.3.2库,并尝试通过实现JSONSerializableWithType接口在自定义包装器Object上指定自定义JSON序列化,该接口包含一个名为serialize()的方法,Jackson调用此方法时尝试序列化JSON的Object实例。

奇怪的是,只要我的Object包装器没有扩展LinkedHashMap< ...>,就会正确调用此序列化方法。 如果我的Object包装器扩展了一个杰克逊“知道”如何以默认方式序列化的类,则不再调用serialize()方法。

我的包装类看起来像这样:

public class ResponseRoomOccupancy
    extends LinkedHashMap<...>
    implements org.codehaus.jackson.map.JsonSerializableWithType {

    @Override
    public void serialize(JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {

        jgen.writeStartObject();
        // actual serialization of the object
        jgen.writeEndObject();
    }

    @Override
    public void serializeWithType(JsonGenerator jgen,
            SerializerProvider provider, TypeSerializer typeSer)
            throws IOException, JsonProcessingException {
        serialize(jgen, provider);
    }
}

控制器:

@RequestMapping(value = "/occupancy")
public @ResponseBody ResponseRoomOccupancy
getRoomOccupancy(RequestRoomOccupancy request) {

    return appointmentService.getEnrichedRoomOccupancy(request);
}

有人可以向我解释为什么杰克逊不会在扩展LinkedHashMap的类上使用自定义的序列化方法吗?

更新

正如Sotirios Delimanolis正确指出的那样,JSONSerializableWithType接口是旧版Jackson(&lt; 1.9)的一部分。 但是我不知道为什么这种自定义序列化适用于自定义类(例如,如果LinkedHashMap与某些类Foo&lt; ...&gt;交换)。

1 个答案:

答案 0 :(得分:1)

你正在使用杰克逊2,is completely incompatible with Jackson 1. JsonSerializableWithType是杰克逊1的界面。你不能让他们一起工作。杰克逊2根本不寻找JsonSerializableWithType

而是使用

注释您的LinkedHashMap类型
@JsonSerialize(using = YourSerializer.class)

并让YourSerializer完成工作。

关于您的评论和编辑,Jackson为已知类型提供了一些默认序列化/反序列化器,例如ListSetString,{{1} }, Number。但是,它不知道您的自定义类型。它必须根据分析类型的内容构建一个新的序列化程序。