我有一个看起来像这样的课程:
@JsonDeserialize(builder=ContainerBuilder.class)
class Container {
@JsonSerializer(using=MySerializer.class)
@JsonDeserializer(using=MyDeserializer.class)
ThirdPartyMap<MyKey, MyValue> map;
}
我需要一个自定义序列化程序,因为我的地图中的键具有结构,默认情况下,Jackson会创建一个以key.toString()
作为字段名称的字段。
我想让我的反序列化器具有通用性,而不是硬编码MyKey
和MyValue
作为地图的类型。类文件存储字段的泛型类型,因此我希望能够获取该信息。但是,我找不到它。
我确实发现Custom Jackson Deserializer Getting Access to Current Field Class建议使用JsonParser.getCurrentValue()
来(我认为)获取返回值的实例并使用反射来查找字段。但是,由于我反序列化的类是最终的并且是使用构建器创建的,因此getCurrentValue
返回null。
看起来deserializeWithType
也可能是相关的,但我无法弄清楚如何调用该方法。
编辑:类型擦除不会在运行时完全删除泛型。如果我有Map<String, Integer>
,那么通过查看对象,擦除会阻止我学习通用参数。
但是,如果我有类interface Data { Collection<String> getList() }
这样的类,则返回类型的通用信息是类的一部分。实际上,它必须在类文件中,否则,我可以将该类放在jar文件中并使用它:Collection<Integer> c = data.getList();
并且编译器不会知道发出编译错误。
杰克逊必须阅读课程信息以了解该领域的类型,因此它(至少在原则上)也应该能够获得该类型的通用参数。它是否以自定义反序列化程序可访问的方式执行和操作是一个单独的问题,以及此处的基本问题。