有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Jackson自定义反序列化程序中获取输出字段的通用类型

我有一门课是这样的:

@JsonDeserialize(builder=ContainerBuilder.class)
class Container {
     @JsonSerializer(using=MySerializer.class)
     @JsonDeserializer(using=MyDeserializer.class)
     ThirdPartyMap<MyKey, MyValue> map;
}

我需要一个自定义序列化程序,因为我的映射中的键具有结构,而Jackson在默认情况下会创建一个以key.toString()作为字段名的字段

我想让我的反序列化程序通用,而不是硬编码MyKeyMyValue作为映射的类型。类文件存储字段的泛型类型,因此我希望能够获得这些信息。然而,我一直没能找到它

我确实找到了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) 个答案