GSON通过其字段名称反序列化Object

时间:2016-03-16 13:28:31

标签: java android gson deserialization

让我们假设我们有这个json:

{
 "id": 1,
 "first_name": "name"
 "studentId": "1235234"
}

我知道我可以通过像这样制作类来对GSON进行反序列化:

class Student {
  int id;
  String first_name;
  String studentId;
}

有没有办法通过使用两个类来实现相同的结果,即

class User {
   int id;
   String first_name;
}

class Student {
   User user;
   String studentId;
}

有没有办法为GSON指定一些注释,以便它知道如何填充'user'对象,除了Student类扩展User类?

更新

1)感谢有关扩展的建议,但我忘了提到我无法扩展'用户'(不要问为什么:)),所以这就是为什么我首先要寻找解决方法

2)自定义反序列化器可以完成这项工作,但是我有多个类中包含“User”,所以这意味着要添加很多类,我也想避免这种情况。

提前致谢, 米洛斯

2 个答案:

答案 0 :(得分:0)

只需将学生班级的结构更改为

即可
public class StudentData{
    private String studentId;
    private User user;

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public class User {
        int id;
        String first_name;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getFirst_name() {
            return first_name;
        }

        public void setFirst_name(String first_name) {
            this.first_name = first_name;
        }
    }
}

答案 1 :(得分:0)

定义自定义反序列化器:

public class StudentDeserializer implements JsonDeserializer<Student>{

@Override
public Student deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2)
        throws JsonParseException {
    JSONObject jobject = (JsonObject) arg0;
    Student st = new Student();
    st.studentId = jobject.get("studentId").getAsString();
    st.user = new User();
    st.user.id = jobject.get("id").getAsInt();
    st.user.first_name = jobject.get("first_name").getAsString()
    return Student;
}

}

然后在反序列化之前注册它:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Student.class, new StudentDeserializer());