我在 Spring MVC 项目中使用 Jackson 2.3.2 库,并尝试通过实现 JSONSerializedWithType 接口(interface)来在自定义包装对象上指定自定义 JSON 序列化,该接口(interface)包括 Jackson 在尝试序列化时调用的名为 serialize() 的方法JSON 的对象实例。
奇怪的是,只要我的对象包装器不扩展 LinkedHashMap<...>,这个序列化方法就会被正确调用。 如果我的对象包装器扩展了 Jackson“知道”如何以默认方式序列化的类,则不再调用 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);
}
}
Controller :
@RequestMapping(value = "/occupancy")
public @ResponseBody ResponseRoomOccupancy
getRoomOccupancy(RequestRoomOccupancy request) {
return appointmentService.getEnrichedRoomOccupancy(request);
}
任何人都可以向我解释为什么 Jackson 不在扩展 LinkedHashMap 的类上使用自定义的序列化方法吗?
更新:
正如 Sotirios Delimanolis 正确指出的那样,JSONSerializedWithType 接口(interface)是旧版本 Jackson (<1.9) 的一部分。 但是我不知道为什么这种自定义序列化适用于自定义定义的类(例如,如果 LinkedHashMap 与某些类 Foo<...> 交换)。
最佳答案
您正在使用 Jackson 2 is completely incompatible with Jackson 1. JsonSerializedWithType
是 Jackson 1 的接口(interface)。您不能让它们一起工作。 Jackson 2 根本不寻找 JsonSerializedWithType
。
相反,请使用
注释您的LinkedHashMap
类型
@JsonSerialize(using = YourSerializer.class)
并让 YourSerializer
完成工作。
关于您的评论和编辑,Jackson 有一些针对已知类型的默认序列化器/反序列化器,例如 List
、Set
、String
、数字
、和 map
。但是,它不知道您的自定义类型。它必须根据分析您的类型所发现的内容构建一个新的序列化器。
关于java - 为什么 Jackson 不使用扩展 LinkedHashMap 的自定义包装类的 serialize() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698687/