【问题标题】:GSON deserialize Object by its field namesGSON 按其字段名称反序列化对象
【发布时间】:2016-03-16 13:28:30
【问题描述】:

假设我们有这个 json:

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

我知道我可以使用 GSON 进行反序列化,方法是像这样创建 Class:

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

有没有办法通过使用两个类来达到相同的结果,即。

class User {
   int id;
   String first_name;
}

class Student {
   User user;
   String studentId;
}

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

更新

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

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

提前致谢, 米洛斯

【问题讨论】:

  • 你可以使用它与 new Gson().fromJson(jsonObject.toString, Student.class);和新的 Gson().fromJson(jsonObject.toString, User.class);
  • 如果 Student 扩展 User ,我认为这将使用 Student.class 作为 fromJson() 的参数来工作
  • 在这种情况下,您必须为 Student 类创建自定义反序列化程序。但除了@Yazan 的评论:如果 Student 扩展用户,而不是“包含”用户,它看起来更合乎逻辑。学生仍然是用户,对吧?
  • 感谢回答者,更新了问题....问题的出现只是因为我应该避免扩展 User 类。回复:自定义反序列化器 - 我可以只“自定义”这部分并让其他字段自动反序列化,还是我需要为整个类编写解析代码
  • 您可以使用此站点生成 Gson 类。 jsonschema2pojo.org

标签: java android gson deserialization


【解决方案1】:

只需将 Student 类的结构更改为

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;
        }
    }
}

【讨论】:

  • 嗨,不起作用,因为 JSON 是这样的: { "id": 1, "first_name": "name" "studentId": "1235234" }
  • 好吧,你的 JOSN 结构是这样的。然后,您需要对 Gson().fromJson() 进行两次不同的调用,一次用于 Student 类,另一个用于 User 类。但是 Student 类中的 User 类将保持为空。
【解决方案2】:

定义一个自定义反序列化器:

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());

【讨论】:

  • 嗨,是的,这会起作用,但如果我有 5-6 个“学生”类,这意味着必须编写 5-6 个自定义反序列化器,如果可能的话,我想避免这种情况.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多