You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:11:33