gpt4 book ai didi

java - 为什么 Jackson 不使用扩展 LinkedHashMap 的自定义包装类的 serialize() 方法

转载 作者:行者123 更新时间:2023-12-01 12:34:33 25 4
gpt4 key购买 nike

我在 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 有一些针对已知类型的默认序列化器/反序列化器,例如 ListSetString 数字 map 。但是,它不知道您的自定义类型。它必须根据分析您的类型所发现的内容构建一个新的序列化器。

关于java - 为什么 Jackson 不使用扩展 LinkedHashMap 的自定义包装类的 serialize() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com