如何获得json对象中传递的抽象类实现之一的对象



我有一个春季项目,其中我有一个抽象类Person如下

@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个实现,Employee和Driver如下

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

是否有一种方法我可以获得实例化对象的持有,以便我可以做任何我想做的对象的字段(field1和field2在雇员和field3的情况下,field4和field5在驱动程序的情况下),说company.getPerson().getField1();

Thanks in advance

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

最新更新