如何获得在 json object 中传递的抽象 class 实现之一的 object

How to get object of one of the abstract class implementations passed in a json object

我有一个 spring 项目,其中我有一个摘要 class 人如下

@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 {

}

我有这个人 class、雇员和 Driver 的 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
 
}

人 object 包含在公司 class 中,如下所示

public class Company {

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


}

现在,我收到了 json 格式的请求,其中一个字段是这个人 object 如下:

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

事实是,此人可以是 driver 或员工类型。字段“type”(不作为变量出现)在 json 中传递,并且相应的 object 被实例化。但是,我无法掌握实例化的 object,因为实例化发生在运行时,而且我无法在代码中告诉实例化了哪个 class。因此无法调用适当的 object(employee or driver).

的 getter

有没有一种方法可以控制实例化的 object,这样我就可以对 object 的字段做任何我想做的事情(如果是 employee 和 field3,则为 field1 和 field2 , field4 和 field5 在 driver 的情况下),比如 company.getPerson().getField1();

提前致谢

如果 getField1()Employee 的方法而不是任何 Person 的方法,那么不,你不能做 getPerson().getField1()

这就是逻辑。如果您在 Person 上调用 getField1(),则意味着您知道此 PersonEmployee 而不是 Driver.

因此,您应该简单地将处理 Employee 的代码与处理 Driver 的代码分开:

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();
    //...
}