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

标签 java json serialization jackson wrapper

我在 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/

相关文章:

java - 获取认证文件的指纹信息

关于监听器的 Java 并发问题

android - 使用 gson 反序列化 NullPointerException

json - Go:在 for 循环中使用 JSON Unmarshal

javascript - 动态重新加载日期选择器

php - 如何从序列化输出中获取值

java - 使用 hibernate 返回错误的查询计数值

java - 乘法比分支更快

java - 序列化 BigInteger : signum-magnitude mismatch

java - 有没有办法知道反序列化后发送了哪种类型的java对象?