如何强制Gson将HttpResponse中的JSON对象解析为String类型字段
这个问题我之前也碰到过,其实核心是要让Gson把JSON对象直接序列化为字符串而不是默认解析成LinkedTreeMap这类Object类型,下面给你两种可行的方案:
方案一:全局注册自定义TypeAdapter
你可以写一个自定义的TypeAdapter<String>,让它在反序列化时把JSON对象转换成字符串,然后注册到GsonBuilder中全局生效。
首先创建适配器类:
import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.Gson; import java.io.IOException; public class JsonObjectToStringAdapter extends TypeAdapter<String> { @Override public void write(JsonWriter out, String value) throws IOException { // 序列化时的处理:如果需要把字符串转成JSON对象写入,可按下面逻辑实现 if (value == null) { out.nullValue(); return; } JsonElement element = JsonParser.parseString(value); new Gson().toJson(element, out); } @Override public String read(JsonReader in) throws IOException { // 反序列化时,将JSON对象转为字符串 JsonElement element = JsonParser.parseReader(in); return new Gson().toJson(element); } }
然后创建Gson实例时注册这个适配器:
Gson gson = new GsonBuilder() .registerTypeAdapter(String.class, new JsonObjectToStringAdapter()) .create(); // 之后用这个gson实例解析响应 YourClass result = gson.fromJson(httpResponseBody, YourClass.class);
方案二:针对特定字段使用@JsonAdapter注解
如果你不想全局生效,只想让list_elements这个字段按规则解析,可以直接在字段上添加@JsonAdapter注解,指定我们写的适配器:
import com.google.gson.annotations.JsonAdapter; public class YourClass { // 只对这个字段应用自定义适配器 @JsonAdapter(JsonObjectToStringAdapter.class) private String list_elements; // 其他字段... // getter和setter方法 }
然后直接用普通的Gson实例解析即可:
Gson gson = new Gson(); YourClass result = gson.fromJson(httpResponseBody, YourClass.class);
额外优化:兼容多种字段类型
如果你的list_elements字段有时候是JSON对象,有时候是普通字符串,可以在适配器的read方法里做兼容处理:
@Override public String read(JsonReader in) throws IOException { JsonToken token = in.peek(); switch (token) { case STRING: return in.nextString(); case BEGIN_OBJECT: JsonElement element = JsonParser.parseReader(in); return new Gson().toJson(element); case NULL: in.nextNull(); return null; default: // 处理其他类型(比如数组),这里可以根据需求调整 in.skipValue(); return null; } }
这样不管接口返回的是JSON对象还是普通字符串,都能正确解析成String类型啦。
内容的提问来源于stack exchange,提问作者Flofloaud1034
相关产品推荐
相关产品推荐

