【问题标题】:Jackson - How to specify a single implementation for interface-referenced deserialization?Jackson - 如何为接口引用的反序列化指定单个实现?
【发布时间】:2012-09-23 04:49:33
【问题描述】:

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

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

这可能吗?

【问题讨论】:

标签: java json jackson deserialization


【解决方案1】:

使用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);

【讨论】:

【解决方案2】:

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

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

这个问题已经回答了一段时间,但我想给你另一个选项,它不需要调整 ObjectMapper 并且比 @JsonTypeInfo 注释更简单。

【讨论】:

  • 这是迄今为止对 OP 问题的最佳答案。
  • 如果我有 2 个实现并且我想基于某些类型字段进行反序列化怎么办
  • @Gaurav 这个答案应该可以帮助你:stackoverflow.com/questions/27506241/…
  • 请注意,如果目标接口嵌套在集合中,则应使用@JsonDeserialize(contentAs=NestedType.class)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多