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

