如何使用GSON反序列化包含多种类型的JSON数组?
Gson反序列化混合类型数组的解决方案
问题描述
我有如下JSON字符串:
{ "sort": [1000.0, "id123456789"] }
尝试使用GSON.fromJson(str, SortArray.class)将其反序列化为对象,但由于JSON数组包含double和String两种不同类型,无法通过常规建模完成反序列化。之前尝试的Immutable接口代码无法正常工作:
@Gson.TypeAdapters(nullAsDefault = true) @Value.Immutable public interface SortArray { @Value.Parameter double sortScore(); @Value.Parameter String id(); }
原因分析
Gson默认无法直接将混合类型的JSON数组映射到自定义实体类(或Immutable接口),因为它无法自动将数组的索引元素与类的属性一一对应,必须手动指定映射规则。
解决方案
方法一:自定义TypeAdapter(推荐)
通过自定义TypeAdapter,手动实现数组元素到目标对象的映射逻辑,同时支持序列化和反序列化。
- 定义目标实体类(或保留Immutable接口)
如果使用普通类:
public class SortArray { private final double sortScore; private final String id; public SortArray(double sortScore, String id) { this.sortScore = sortScore; this.id = id; } public double getSortScore() { return sortScore; } public String getId() { return id; } }
如果继续使用Immutable接口,确保已生成对应的实现类(如ImmutableSortArray)。
- 编写自定义TypeAdapter
public class SortArrayTypeAdapter extends TypeAdapter<SortArray> { @Override public void write(JsonWriter out, SortArray value) throws IOException { // 序列化时将对象转为数组格式 out.beginArray(); out.value(value.getSortScore()); // 对应Immutable接口则用value.sortScore() out.value(value.getId()); // 对应Immutable接口则用value.id() out.endArray(); } @Override public SortArray read(JsonReader in) throws IOException { // 反序列化时读取数组元素并构建对象 in.beginArray(); double sortScore = in.nextDouble(); String id = in.nextString(); in.endArray(); // 普通类用构造方法,Immutable接口用生成的of方法 return new SortArray(sortScore, id); // return ImmutableSortArray.of(sortScore, id); } }
- 注册TypeAdapter并使用
需要为外层JSON对象建模:
public class SortResponse { private SortArray sort; public SortArray getSort() { return sort; } }
创建Gson实例并注册适配器:
Gson gson = new GsonBuilder() .registerTypeAdapter(SortArray.class, new SortArrayTypeAdapter()) .create(); SortResponse response = gson.fromJson(jsonStr, SortResponse.class); SortArray sortArray = response.getSort();
方法二:Object数组中转(快速实现)
如果仅需反序列化,不需要序列化,可以直接解析JSON数组后手动转换:
// 解析外层JSON对象 JsonObject jsonObject = gson.fromJson(jsonStr, JsonObject.class); JsonArray sortArray = jsonObject.getAsJsonArray("sort"); // 提取数组元素并构建对象 double sortScore = sortArray.get(0).getAsDouble(); String id = sortArray.get(1).getAsString(); SortArray result = new SortArray(sortScore, id); // 或ImmutableSortArray.of(sortScore, id);
内容的提问来源于stack exchange,提问作者wanderingstu
相关产品推荐
相关产品推荐

