我在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;交换)。
答案 0 :(得分:1)
你正在使用杰克逊2,is completely incompatible with Jackson 1. JsonSerializableWithType
是杰克逊1的界面。你不能让他们一起工作。杰克逊2根本不寻找JsonSerializableWithType
。
而是使用
注释您的LinkedHashMap
类型
@JsonSerialize(using = YourSerializer.class)
并让YourSerializer
完成工作。
关于您的评论和编辑,Jackson为已知类型提供了一些默认序列化/反序列化器,例如List
,Set
,String
,{{1} },和 Number
。但是,它不知道您的自定义类型。它必须根据分析类型的内容构建一个新的序列化程序。