Jackson - 如何为接口引用的反序列化指定单个实现?

时间:2012-10-02 10:19:13

标签: java json jackson deserialization

我想用Jackson反序列化JSON-Object。因为目标是一个接口,我需要指定应该使用哪个实现。

可以使用@JsonTypeInfo-Annotation将此信息存储在JSON-Object中。但我想在源代码中指定实现,因为它始终是相同的。

这可能吗?

3 个答案:

答案 0 :(得分:33)

使用SimpleAbstractTypeResolver

ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule("CustomModel", Version.unknownVersion());

SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver();
resolver.addMapping(Interface.class, Implementation.class);

module.setAbstractTypes(resolver);

mapper.registerModule(module);

答案 1 :(得分:19)

如果您只有单个接口实现,还有另一种方法可行。

myData[age = 10, Z = 7, var = 'waveln')

这个问题很久以前就得到了解答,但我想给你另一个选项,它不需要调整ObjectMapper,也比@JsonTypeInfo注释更简单。

答案 2 :(得分:5)

您也可以在界面上使用@JsonDeserialize(as = ImplementationClass.class),所有引用都将以相同的方式反序列化。

注意,如果您的某个实现类是枚举,那么枚举上也可能需要@JsonFormat(shape = JsonFormat.Shape.OBJECT)