38

我想用杰克逊反序列化一个 JSON 对象。因为目标是一个接口,所以我需要指定应该使用哪个实现。

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

这可能吗?

4

3 回答 3

46

使用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);
于 2012-10-02T10:24:29.017 回答
34

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

public class ClassYouWantToDeserialize {
    @JsonDeserialize(as = ImplementationClass.class)
    private InterfaceClass property;
...
}

这个问题在不久前得到了回答,但我想给你另一个不需要调整 ObjectMapper 的选项,而且比 @JsonTypeInfo 注释要简单得多。

于 2016-06-21T02:04:27.500 回答
8

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

请注意,如果您的实施类之一是枚举,则您可能还需要@JsonFormat(shape = JsonFormat.Shape.OBJECT)枚举。

于 2017-07-10T19:49:12.040 回答