我在Spring MVC项目中使用Jackson 2.3.2库,并试图通过实现JSONSerializableWithType接口指定自定义包装对象上的自定义JSON序列化其中包括在尝试将对象实例序列化为JSON时被Jackson调用的名为serialize()的方法。为什么不使用serialize()自定义包装类的方法扩展LinkedHashMap
奇怪的是,只要我的对象包装不扩展LinkedHashMap < ...>,就可以正确调用这个序列化方法。 如果我的对象包装扩展了一个杰克逊“知道”如何以默认方式序列化的类,则不再调用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类?
UPDATE:
作为索蒂里奥斯扎Delimanolis正确地指出的那样,JSONSerializableWithType接口是较旧版本的杰克逊(< 1.9)的一部分。 但我不知道为什么这种自定义序列化与自定义类的工作(例如,如果LinkedHashMap与某些类Foo < ...>交换)。
好的,这是正确的。但我无法弄清楚,为什么它可以与自定义类一起工作。我更新了这个问题。 – juffel 2014-09-11 09:59:41
@juffel看我的编辑。 – 2014-09-11 14:27:06
我认为杰克逊的这种行为并不是非常一致。 – juffel 2014-09-12 15:01:50