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

Android中如何用Retrofit获取JSON数组中的指定价格数据

解决嵌套数组JSON的Model类创建与数据提取问题

嘿,我来帮你搞定这个嵌套数组的JSON解析问题!你遇到的是典型的二维数组型JSON,每个字段(比如price)都是由多个[时间戳, 数值]子数组组成的集合,咱们一步步来写对应的Model类,轻松提取你需要的价格数据。

先分析JSON结构

你给出的核心结构是:

{
  "market_cap": [ [1504664370000, 74300994770], [1504750775000, 74594182198] ],
  "price" : [ [1504750775000, 4507.45], [1504839280000, 4599.26] ],
  "volume": [ [1504750775000, 2095800000], [1504839280000, 1752760000] ]
}

其中price是一个二维数组,每个子数组的第一个元素是Unix时间戳(毫秒),第二个就是你需要的价格数值。

方法一:封装成对象(更规范,便于后续扩展)

如果想把时间戳和价格封装成一个实体类,方便后续操作,可以这样写Model:

1. 顶层响应类 + 内部数据点类

public class MarketDataResponse {
    // 如果你不需要market_cap和volume,可以只保留price字段
    private List<DataPoint> market_cap;
    private List<DataPoint> price;
    private List<DataPoint> volume;

    // 只给price写Getter即可,其他字段按需添加
    public List<DataPoint> getPrice() {
        return price;
    }

    // 内部类表示每个[时间戳, 数值]的子数组
    public static class DataPoint {
        private long timestamp;
        private double priceValue;

        // 用于Gson解析数组的构造方法
        public DataPoint(long timestamp, double priceValue) {
            this.timestamp = timestamp;
            this.priceValue = priceValue;
        }

        // 获取你需要的价格数值
        public double getPriceValue() {
            return priceValue;
        }

        // 按需添加时间戳的Getter
        public long getTimestamp() {
            return timestamp;
        }
    }
}

2. 配置Gson解析器(适配数组转对象)

因为默认Gson不会自动把数组转换成自定义对象,所以需要写一个TypeAdapter来处理:

public class DataPointTypeAdapter extends TypeAdapter<MarketDataResponse.DataPoint> {
    @Override
    public void write(JsonWriter out, MarketDataResponse.DataPoint value) throws IOException {
        // 序列化时的逻辑(如果不需要上传数据可以省略)
        out.beginArray();
        out.value(value.getTimestamp());
        out.value(value.getPriceValue());
        out.endArray();
    }

    @Override
    public MarketDataResponse.DataPoint read(JsonReader in) throws IOException {
        // 反序列化核心逻辑:读取数组的两个元素,生成DataPoint对象
        in.beginArray();
        long timestamp = in.nextLong();
        double price = in.nextDouble();
        in.endArray();
        return new MarketDataResponse.DataPoint(timestamp, price);
    }
}

3. 配置Retrofit使用自定义Gson

在创建Retrofit实例时,注册这个TypeAdapter:

Gson customGson = new GsonBuilder()
        .registerTypeAdapter(MarketDataResponse.DataPoint.class, new DataPointTypeAdapter())
        .create();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("你的API基础地址")
        .addConverterFactory(GsonConverterFactory.create(customGson))
        .build();

4. 提取价格数据

当你通过Retrofit获取到MarketDataResponse对象后,直接遍历提取:

// 假设你已经拿到了response实例
List<MarketDataResponse.DataPoint> pricePoints = response.getPrice();
List<Double> targetPrices = new ArrayList<>();

for (MarketDataResponse.DataPoint point : pricePoints) {
    targetPrices.add(point.getPriceValue());
}
// targetPrices里就是你需要的所有价格数值啦!

方法二:直接用二维列表(快速实现,适合仅提取数据)

如果不需要封装对象,只想快速拿到价格,Model类可以更简单:

public class MarketDataResponse {
    private List<List<Number>> price;

    public List<List<Number>> getPrice() {
        return price;
    }
}

提取价格数据

这种方式不需要额外配置Gson,直接提取子数组的第二个元素:

List<List<Number>> priceArrays = response.getPrice();
List<Double> targetPrices = new ArrayList<>();

for (List<Number> array : priceArrays) {
    // 子数组索引1的元素就是价格,转成Double类型
    targetPrices.add(array.get(1).doubleValue());
}

两种方法对比

  • 方法一更规范,适合后续需要对时间戳和价格做更多操作的场景;
  • 方法二更快捷,适合只需要提取价格的简单需求。

根据你的实际情况选就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:25