Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中如何从父对象获取子对象?_Java_Json - Fatal编程技术网

在java中如何从父对象获取子对象?

在java中如何从父对象获取子对象?,java,json,Java,Json,我在应用程序开发方面遇到了麻烦。我的任务是我有一个包含一组person对象的服务对象。person对象有两个派生对象,称为student和teacher。我从客户机到服务器获取的这个服务对象是一个json对象。在服务器端,我可以使用service.getPersonList()方法从服务中获取List对象。但是我无法获取Person的子类。我的代码是这样的 [{"year":"4","name":"sreenu","type":1},{"dept":"physics","name":"someh

我在应用程序开发方面遇到了麻烦。我的任务是我有一个包含一组person对象的服务对象。person对象有两个派生对象,称为student和teacher。我从客户机到服务器获取的这个服务对象是一个
json
对象。在服务器端,我可以使用
service.getPersonList()
方法从服务中获取
List
对象。但是我无法获取
Person
的子类。我的代码是这样的

[{"year":"4","name":"sreenu","type":1},{"dept":"physics","name":"somehow","type":2}]
//人

public class Person {

    private String name;
    private Integer type;

    public static final Integer TYPE_STUDENT = 1 ;
    public static final Integer TYPE_TEACHER = 2 ;

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
//学生

public class Student extends Person{

    private Integer year;

    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }
}
//老师

public class Teacher extends Person{

    private String dept;

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }
}
//服务

public class Service {

    private List<Person> personList;

    public List<Person> getPersonList() {
        return personList;
    }

    public void setPersonList(List<Person> personList) {
        this.personList = personList;
    }
}
我正在尝试使用type属性查找子类。我得到的类型值意味着父对象,但无法从中获取子对象。 我怎样才能解决这个问题

在控制器中,我得到的json对象如下

//控制器 公共字符串存储服务(@RequestBody字符串服务){

List personList=(List)gson.fromJson(
数据,新的TypeToken(){}.getType()
);
for(个人:个人列表){
if(person.getType()==person.TYPE\u STUDENT){
学生=(学生)人;
System.out.println(student.getYear());
}
if(person.getType()==person.TYPE\u TEACHER){
教师=(教师)教师;
System.out.println(teacher.getDept());
}
}
}


我得到了班级演员异常。甚至我也尝试过运算符的实例。

您正在反序列化为更简单的类型(Person),而不是更复杂的类型(Student/Teacher)。这意味着其他子类型信息(如年份或部门)将被丢弃。一个学生可以被塑造成一个人,但是一个人不能被塑造成一个学生


这反映了一个设计问题。您需要更改Person类,使其包含子类型所需的所有可能数据,或者在从Json创建对象之前,您需要先将数据分隔为教师和学生

您正在反序列化为更简单的类型(Person),而不是更复杂的类型(Student/Teacher)。这意味着其他子类型信息(如年份或部门)将被丢弃。一个学生可以被塑造成一个人,但是一个人不能被塑造成一个学生

这反映了一个设计问题。您需要更改Person类,使其包含子类型所需的所有可能数据,或者在从Json创建对象之前,您需要先将数据分隔为教师和学生

List<Person> personList = (List<Person>) gson.fromJson(
    data, new TypeToken<List<Person>>(){}.getType()
);
for(Person person : personList) {
    if(person.getType() ==  Person.TYPE_STUDENT) {
        Student student = (Student) person;
        System.out.println(student.getYear());
    }
    if(person.getType() ==  Person.TYPE_TEACHER) {
        Teacher teacher = (Teacher) teacher;
        System.out.println(teacher.getDept());
    }
}