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
相关产品推荐
相关产品推荐

