jackson 如何获取传入json对象的抽象类实现之一的对象

pcww981p  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(181)

我有一个Spring项目,其中有一个抽象类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类的两个实现,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

}

问题是,该人员可以是驾驶员或雇员类型。字段“类型”(不是以变量的形式出现)被传入json,相应的对象被示例化。但是,我无法获得示例化对象,因为示例化发生在运行时,我无法在代码中判断哪个类被示例化。因此,无法调用相应对象的getter(员工或驾驶员)。
是否有一种方法可以获得示例化的对象,以便可以对对象的字段(对于employee,为field 1和field 2;对于driver,为field 3、field 4和field 5)(比如company.getPerson().getField1();)执行任何操作
先谢谢你

5uzkadbs

5uzkadbs1#

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

相关问题