当前位置: 首页 > 面试题库 >

杰克逊多态性:如何将多个子类型映射到同一类

连厉刚
2023-03-14
问题内容

我正在使用Jackson1.9.x。坚持以动物为例,这是我想做的:

假设我有一个Animal类:

public class Animal {
    private String type;
    // accessors
}

public class Mammal extends Animal {
    private String diet;
    // accessors
}

public class Bird extends Animal {
    private boolean tropical;
    // accessors
}

我希望能够执行以下操作(将一些子类型映射到一个类,将更多子类型映射到另一个类):

@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Mammal.class, name = "Dog"),
                @JsonSubTypes.Type(value = Mammal.class, name = "Cat"),
                @JsonSubTypes.Type(value = Bird.class, name = "Dodo"},
                @JsonSubTypes.Type(value = Bird.class, name = "Cockatoo"})
public class Animal {

}

我现在看到的是,杰克逊只会识别“狗到哺乳动物”和“渡渡鸟到鸟”的映射。这是因为StdSubtypeResolver._collectAndResolve()仅允许同一类注册一次(由于NamedType.equals()的实现)。

有没有解决我遇到的问题的方法?


问题答案:

也许不使用注释。问题来自这样的事实,即这样的映射不适用于序列化,并且现有的映射确实期望一对一(双向)关系。但是您可能想在jackson-
databind问题跟踪器
处提交RFE
;增加支持是可能的。



 类似资料:
  • 问题内容: 我怎样才能告诉一个类只包括NON_EMPTY和NON_NULL值,使用 抛出重复注释的错误。 问题答案: “空总是被认为是空的”- 杰克逊的网站 因此NON_EMPTY规则涵盖了两种情况。

  • 问题内容: 我正在尝试使用Jakson反序列化嵌套的多态类型。意思是我的顶级类型引用了另一个多态类型,该类型最终由不是抽象的类扩展。这不起作用,并引发异常。 这是我要尝试做的简化示例。 我得到有关抽象类型的标准例外。 让我解释一下我的用例。我有一个描述数据工作流程的Json文档。我在“一级”有一个抽象类型,描述了对单个值的操作。我派生了一堆不是抽象的类,它们实现了常见的操作(我用@JsonSubT

  • 问题内容: 我有这个回应: 然后,我要基于 exercise_type 属性实例化不同的对象实例(的子类),因此我在以下位置创建此混合: 所以我创建如下 我的测试: 问题在于,由于某种原因,用作属性on 的 exercise_type 属性被映射为 null 。知道我该如何解决吗? 问题答案: 最后,我在API文档中找到了解决方案 关于类型标识符可见性的注意事项:默认情况下,类型标识符的反序列化(

  • 我构建了以下内容: 上面的代码非常好,非常棒。然而,我仍然想要更多。我希望允许任何Iterable,而不是指定我的HList将包含列表。这样地: 第二个版本无法编译,并显示消息“无法找到参数映射器的隐式值:shapeless.ops.hlist.mapper[iterateOverHList.type,shapeless:[List[Int],shapeless:[List[String],sha

  • 问题内容: 我有一个叫做抽象类,然后两个是实现,和。我遇到的问题是,当我将a的其余端点调用到数据库中时,理想情况下,我希望它像将实例传递给REST端点的位置一样。如果不是用一个以上的实现来抽象,那就没问题了,但是由于我有2个,所以我得到了一个错误。 “问题:抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,要么被其他类型信息实例化” 在找到解决方案之后,我找到了一个SO答案,说我可以使用类

  • 问题内容: 我知道如果文件User.json有 我可以像这样构造一个User对象: 但是,如果文件User.json具有以下内容,该如何构造对象列表: ? 问题答案: 多种方式:如果您具有这些的JSON数组,则可以执行以下操作: 或者,如果只是一系列根级别值,则可以执行以下操作: 并遍历值(添加到列表等)