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

Jackson JSON库:如何实例化包含抽象字段的类

卓宏达
2023-03-14
问题内容

我想将JSON字符串转换为java对象,但是此对象的类包含抽象字段,Jackson无法实例化抽象字段,并且不会产生该对象。告诉它一些抽象类的默认实现的最简单方法是什么

setDefault(AbstractAnimal.class, Cat.class);

或根据JSON属性名称决定实现类,例如 对于JSON对象:

{
    ...
    cat: {...}
    ...
}

我只是想:

setImpl("cat", Cat.class);

我知道在Jackson中可以将类信息嵌入JSON,但是我不想使我使用的JSON格式复杂化。我想通过设置默认实现类或属性名称(’cat’)来决定使用哪个类-
就像在XStream库中编写的那样:

xStream.alias("cat", Cat.class);

有没有办法做到这一点,尤其是一行,还是需要更多代码?


问题答案:

有多种方法。在1.8版之前,最简单的方法可能是:

@JsonDeserialize(as=Cat.class)
public abstract class AbstractAnimal { ... }

关于基于属性的决定,最好使用进行@JsonTypeInfo,这会自动嵌入(在编写时)并使用类型信息。

类型信息有多种(类名,逻辑类型名)以及包含机制(如所包含的属性,按包装器数组,按包装器对象)。此页面:https :
//github.com/FasterXML/jackson-
docs/wiki/JacksonPolymorphicDeserialization
解释了一些概念。



 类似资料:
  • 我有以下课程: 问题是我只能修改类。

  • 问题内容: 最近,我一直在使用XML解析器。这对我来说仅仅是个开始,我设法了解了如何在Java即使用DOM解析器类,以及如何解析XML文档。 我想问自己的是如何允许抽象类(例如和)实例化新实例?然后在另一个示例中,我看到: 据我所知,您不能为抽象类和接口类实例化(换句话说,创建一个对象)。我对么? 难道和方法创建上面的抽象类的实例? 我是否缺少使用抽象类及其新对象的内容? 问题答案: 该方法是一个

  • 问题内容: 我创建了一个空的抽象类,并从中继承了该类: 我期望输出是 但是,我得到的是 如果我删除(这样就变成一个普通的类)和/或如果我设置了其他值,问题(显然)就消失了。 这里发生了什么? 问题答案: 这实际上不是ABC的问题,而是PyMongo的问题。有一个关于它的问题在这里。似乎pymongo重写以返回某种数据库类。这意味着将返回一个数据库对象,该对象在布尔上下文中为true。这使ABCMe

  • 我查过了,发现最接近的是这个,除了我没有任何向前的声明。我在基类中只有一个纯虚函数,我在子类中实现它,如下所示: 命令H 命令cpp 数字H 数字cpp 发生文件错误: 一个dd.cpp 添加H

  • 问题内容: 让抽象类定义实例变量是否是一种好习惯? 然后,子类ExternalJavaScript.class会自动获取源变量,但我认为,如果所有子类本身都定义了源而不是继承,则读取代码会更容易。 你有什么建议? /亚当 问题答案: 我本以为这样的话会更好,因为您要添加一个变量,所以为什么不限制访问并使它更整洁呢?您的吸气器/装夹器应该按照罐子上的说明去做。 再次提到这个问题,您在阅读时是否会费心

  • 我正在尝试实现上面提到的解决方案,但是在这里,我得到了一个错误“RowMapper是抽象的,不能实例化”和“表达式的非法开始”。下面正是我所说的