当前位置: 首页 > 知识库问答 >
问题:

如何获取在json对象中传递的一个抽象类实现的对象

云文栋
2023-03-14

我有一个spring项目,其中我有一个抽象类人物,如下所示

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({@Type(value=Employee.class, name="employee"), @Type(value = Driver.class, name = "driver")}) 
public abstract class Person {

}

我有这个Person类的2个实现,员工和驱动程序,如下所示

@JsonTypeName("employee")
public class Employee extends Person {

 private int field1;
 private int field2;
 
 //some getters and setters
 
}

@JsonTypeName("driver")
public class Driver extends Person {

 private int field3;
 private int field4;
 private int field5;
 
 //some getters and setters
 
}

Person对象包含在Company类中,如下所示

public class Company {

 private String name;
 private int id;
 private Person person;// this is the object
 private int people;


}

现在,我收到json格式的请求,其中一个字段是这个person对象,如下所示:

{
 "name": "some name",
 "id": 123,
 "person":{
    "type": "employee"
    "field1":"some field1 value",
    "field2":"some field2 value"
 },
 "people": 100
 
}

问题是,这个人既可以是司机也可以是员工。字段“type”(不作为变量出现)在json中传递,并实例化相应的对象。然而,我无法获得实例化对象,因为实例化发生在运行时,并且我无法在代码中分辨实例化了哪个类。因此无法调用相应对象(employee或driver)的getter。

有没有一种方法可以让我得到实例化对象的控制,这样我就可以对对象的字段做任何我想做的事情(在员工和字段3的情况下是字段1和字段2,在驱动程序的情况下是字段4和字段5),比如company.getPerson(). getField1();

提前谢谢

共有1个答案

杨无尘
2023-03-14

如果getField1()Employee的一种方法,而不是任何Person方法,那么不,您不能执行getPerson()。getField1()

这就是逻辑。如果你在一个上调用getField1(),那就意味着你知道这个是一个员工而不是司机

因此,您应该简单地将处理员工的代码与处理驱动程序的代码分开:

Person person = company.getPerson();
if (person instanceof Employee) {
    Employee employee = (Employee) person;
    employee.getField1();
    //...
} else if (person instanceof Driver) {
    Driver driver = (Driver) person;
    driver.getField3();
    //...
}
 类似资料:
  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边

  • 问题内容: 在viewmodel对象中,以下是属性: 在VIEW中,javascript如下: 请在这里指导,我如何在javascript中获取JSON对象。 问题答案: 您可以使用以下内容: 这将输出以下内容(没有看到您的模型,我仅包含一个字段): 工作小提琴 AspNetCore AspNetCore使用的接口 MVC 5/6 您可以为此使用Newtonsoft: 这使您可以更好地控制json

  • 问题内容: 我正在考虑我的应用程序的解决方案。这是一种情况:我有一个类,该类的方法将ObjectA作为输入参数并调用几个小方法,这些方法中的每个方法都需要ObjectA的某些部分(它们不重叠,即需求和,需求等等)。 …)现在的问题是:鉴于一般的良好代码实践和性能,将ObjectA传递给这些方法中的每一个方法更好,以便它们可以自己提取所需的值,还是仅传递它们的值更好?我的意思是: 要么 感谢您的任何

  • 问题内容: 我有两节课。和。 我有一个要在中使用的功能。我当时正在考虑将的引用传递给的构造函数,然后再调用该函数。 那行得通吗?有人可以给我举个例子吗? 提前致谢! 问题答案: 是的,它将起作用。这是一种不错的方法。您只需传递A类的 实例 : 然后您可以拥有:

  • 问题内容: 这是我要在这里实现的目标: 从数据库获取文件名和ID的列表 在网络路径上搜索这些文件 存储未找到的文件的任何ID 在第二个数据库中搜索该ID 在网络路径上搜索这些文件 列出所有在两个位置均未找到文件的ID。 我遇到的问题是尝试使用我收集的结果中的文件名。 运行代码时,会显示从数据库收集的原始JSON数据,但是当尝试仅列出文件名时,我什么也没得到(甚至没有错误) 关于如何解决此问题并以一

  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?