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

如何使用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,手动实现数组元素到目标对象的映射逻辑,同时支持序列化和反序列化。

  1. 定义目标实体类(或保留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)。

  1. 编写自定义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);
    }
}
  1. 注册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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:55:24