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

Max*_*idt 31 java json jackson deserialization

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

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

这可能吗?

Dav*_*ant 34

使用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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,如果您想将具体实现指定为注释,我只是找到了另一种选择http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types (5认同)

Ily*_*nov 24

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

public class ClassYouWantToDeserialize {
    @JsonDeserialize(as = ImplementationClass.class)
    private InterfaceClass property;
...
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,如果目标接口嵌套到集合中,则应使用“@JsonDeserialize(contentAs=NestedType.class)” (2认同)

Jas*_*ley 6

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

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