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

Gson解析如何处理空字符串与对象类型不一致的可选参数?

解决Gson解析可选参数(对象/空字符串)的兼容问题

要处理这种同一个字段既可能是空字符串又可能是JSON对象的情况,直接用默认的Gson类型绑定会报错,你需要自定义TypeAdapter来兼容两种格式:

1. 定义自定义对象类

先写好你的MyCustomObject,对应正常情况下的结构:

public class MyCustomObject {
    private String url;
    private int width;
    private int height;

    // 补全构造方法、getter和setter
}

2. 编写自定义TypeAdapter

这个适配器会判断JSON的token类型,分别处理空字符串和对象的情况:

public class AttachedImageAdapter extends TypeAdapter<MyCustomObject> {
    @Override
    public void write(JsonWriter out, MyCustomObject value) throws IOException {
        if (value == null) {
            out.value("");
            return;
        }
        // 正常序列化对象
        new Gson().toJson(value, MyCustomObject.class, out);
    }

    @Override
    public MyCustomObject read(JsonReader in) throws IOException {
        JsonToken token = in.peek();
        if (token == JsonToken.STRING) {
            // 跳过空字符串,返回null用于后续判断
            in.nextString();
            return null;
        } else if (token == JsonToken.BEGIN_OBJECT) {
            // 解析为自定义对象
            return new Gson().fromJson(in, MyCustomObject.class);
        }
        // 处理其他未知类型,直接跳过并返回null
        in.skipValue();
        return null;
    }
}

3. 注册并使用适配器

有两种方式可以让Gson使用这个适配器:

方式一:字段注解绑定

直接在目标字段上添加@JsonAdapter注解:

public class ResponseModel {
    @JsonAdapter(AttachedImageAdapter.class)
    private MyCustomObject attached_image;

    // 其他字段及getter/setter
}

方式二:全局注册适配器

创建Gson实例时注册适配器,全局生效:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(MyCustomObject.class, new AttachedImageAdapter())
        .create();

// 解析JSON
ResponseModel response = gson.fromJson(yourJsonString, ResponseModel.class);

4. 后续判断逻辑

解析完成后,直接判断attached_image是否为null即可:

  • 若为null:对应原JSON中字段为空字符串或不存在的情况
  • 若不为null:就是包含url、width、height的正常对象

内容的提问来源于stack exchange,提问作者Universe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:00:49