java在Jackson自定义反序列化程序中获取输出字段的通用类型
我有一门课是这样的:
@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()
来(我认为)获取返回值的实例,并使用反射来查找字段。然而,由于我正在反序列化的类是final,并且是用构建器生成的,getCurrentValue
返回null
看起来deserializeWithType
也可能相关,但我不知道如何调用该方法
编辑:类型擦除不会在运行时完全擦除泛型。如果我有一个Map<String, Integer>
,那么通过查看对象,擦除会阻止我学习泛型参数
但是,如果我有一个类似interface Data { Collection<String> getList() }
的类,那么返回类型的泛型信息就是该类的一部分。事实上,它必须在类文件中,否则,我可以将该类放在jar文件中,并像这样使用:Collection<Integer> c = data.getList();
,编译器将不知道发出编译错误
Jackson必须读取类信息才能知道字段的类型,因此它(至少在原则上)也应该能够获取类型的泛型参数。它是否这样做,以及是否以自定义反序列化程序可以访问的方式这样做,这是一个单独的问题,也是这里的根本问题
共 (0) 个答案