如何创建Gson POJO以处理含可选属性的JSON对象
嘿,这个场景我太熟悉了!用Gson来处理这种带可选属性的JSON对象其实没那么复杂,我给你捋清楚怎么弄:
核心思路
Gson默认会忽略JSON中不存在的字段,所以我们只需要把所有可能出现的属性都定义在POJO类里,并且允许它们为null(也就是不要加非空注解),就能完美适配这三种情况:空对象、仅含val、含val和another_val。
具体实现步骤
1. 定义对应prop的POJO类
先创建一个专门对应prop字段的类(可以是内部类,也可以是单独的类),把所有可能出现的字段都放进去:
public class Prop { // 对应JSON里的"val",允许为null private String val; // 对应JSON里的"another_val",允许为null private String another_val; // 必须要有无参构造器!Gson反射实例化对象需要它 public Prop() {} // 可选:生成getter和setter,方便后续获取/修改属性值 public String getVal() { return val; } public void setVal(String val) { this.val = val; } public String getAnother_val() { return another_val; } public void setAnother_val(String another_val) { this.another_val = another_val; } }
2. 定义外层主POJO类
再创建一个包含prop字段的主类,用来包裹整个JSON结构:
public class MyData { private Prop prop; // 同样需要无参构造器 public MyData() {} // 可选:getter和setter public Prop getProp() { return prop; } public void setProp(Prop prop) { this.prop = prop; } }
测试验证这三种场景
不管是哪种JSON格式,用Gson解析的方式都是一样的:
Gson gson = new Gson(); // 场景1:prop是空对象 String json1 = "{\"prop\": {}}"; MyData data1 = gson.fromJson(json1, MyData.class); // data1.getProp().getVal() 和 data1.getProp().getAnother_val() 都是null // 场景2:prop仅含val String json2 = "{\"prop\": {\"val\": \"true\"}}"; MyData data2 = gson.fromJson(json2, MyData.class); // data2.getProp().getVal() 是"true",another_val是null // 场景3:prop含val和another_val String json3 = "{\"prop\": {\"val\": \"true\", \"another_val\": \"true\"}}"; MyData data3 = gson.fromJson(json3, MyData.class); // 两个字段都能正确获取到值
额外优化技巧
如果觉得Java里的下划线字段名不优雅,可以用@SerializedName注解映射成驼峰命名:
import com.google.gson.annotations.SerializedName; public class Prop { private String val; @SerializedName("another_val") private String anotherVal; // Java里用驼峰,JSON里用下划线 // 构造器、getter/setter... }
另外,如果想把空的{}解析成null而不是空的Prop对象,可以自定义TypeAdapter来实现,但一般默认的行为就足够满足大部分需求了。
内容的提问来源于stack exchange,提问作者Angelina
相关产品推荐
相关产品推荐

