Android DataBinding中如何通过单个POJO同时访问父子类属性?
如何用单个POJO同时访问嵌套响应的父类与子类属性?
我来帮你搞定这个问题!首先先理清你的场景:你有一个嵌套结构的JSON响应,想通过一个POJO同时拿到外层的message、status,还有内层data里的email等属性,现在遇到了空指针异常,咱们一步步解决。
先明确你的问题根源
你当前的写法逻辑没问题,但空指针大概率是因为MyParent.data为null——要么是你没给ParentModel的data属性赋值,要么是POJO类的结构没正确映射JSON的嵌套关系。
解决方案步骤
1. 编写正确的嵌套POJO类
你需要让ParentModel完整映射整个JSON结构,包含外层属性和嵌套的data子结构,最简单的方式是用内部类(也可以单独写一个DataModel类):
public class ParentModel { // 外层属性 private String message; private String status; // 嵌套的data子结构 private Data data; // 构造方法:初始化data避免空指针 public ParentModel() { this.data = new Data(); } // 所有属性的Getter和Setter方法 public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Data getData() { return data; } public void setData(Data data) { this.data = data; } // 内部类映射data的结构 public static class Data { private String first_name; private String last_name; private String email; private String user_id; // 子属性的Getter和Setter public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public String getUser_id() { return user_id; } public void setUser_id(String user_id) { this.user_id = user_id; } } }
2. 修复布局中的空指针问题
有两种方式避免空指针:
- 方式一:用Data绑定的空安全运算符
在布局里访问data的属性时,加上?.运算符,这样当data为null时不会抛出异常:<EditText android:layout_width="match_parent" android:layout_height="40dp" android:text="@={MyParent.data?.email}" android:id="@+id/et_email"/> - 方式二:初始化Data对象
就是上面POJO类里写的构造方法,提前初始化data,确保它永远不会为null,这样直接写@={MyParent.data.email}也不会出问题。
3. 正确赋值POJO实例
在代码里解析JSON后,要把完整的ParentModel实例赋值给Data绑定的变量:
// 比如用Gson解析接口返回的JSON字符串 Gson gson = new Gson(); ParentModel myParent = gson.fromJson(yourJsonResponse, ParentModel.class); // 绑定到布局的变量 binding.setMyParent(myParent);
这样你就可以同时访问父级属性(比如@={MyParent.message})和子属性(@={MyParent.data.email})了!
内容的提问来源于stack exchange,提问作者Ketan Patel
相关产品推荐
相关产品推荐

