如何使用Retrofit获取多个独立JSON对象(非JSON数组)
处理API返回的多个独立JSON对象(键值对形式)
你遇到的情况是API返回的不是JSON数组,而是以股票代码为键、对应股票数据为值的JSON对象,这种结构没法直接用ArrayList映射,但我们可以用Java的Map来完美处理,Retrofit和Gson原生支持这种类型的转换,下面是具体的实现步骤:
1. 定义对应的数据模型类
首先我们需要创建和返回JSON结构匹配的实体类:
Quote类(对应JSON中的quote字段内容)
import com.google.gson.annotations.Expose; public class Quote { @Expose public String symbol; @Expose public String companyName; @Expose public String calculationPrice; @Expose public Double open; @Expose public Long openTime; @Expose public Double close; // 请根据JSON中的字段,补充所有你需要的属性,这里省略部分重复字段 @Expose public Double latestPrice; @Expose public Long marketCap; @Expose public Double peRatio; }
StockQuoteWrapper类(对应每个股票代码下的外层对象)
因为每个股票代码对应的JSON是{"quote": {...}},所以需要一个包装类来包裹Quote对象:
import com.google.gson.annotations.Expose; public class StockQuoteWrapper { @Expose public Quote quote; }
2. 修改Retrofit的API接口
把接口的返回类型改为Observable<Map<String, StockQuoteWrapper>>,其中String对应JSON中的股票代码键,StockQuoteWrapper对应键的值:
import io.reactivex.Observable; import retrofit2.http.GET; public interface StockApi { // 替换成你实际调用的API端点 @GET("your-multiple-stocks-endpoint") Observable<Map<String, StockQuoteWrapper>> getMultipleStockQuotes(); }
3. 调用API并处理数据
调用接口后,你可以直接拿到Map对象,之后可以遍历它,或者把数据转成ArrayList存储:
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; // 调用示例 StockService.getInstance().getStockApi() .getMultipleStockQuotes() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(stockDataMap -> { // 遍历Map获取所有股票数据 for (Map.Entry<String, StockQuoteWrapper> entry : stockDataMap.entrySet()) { String stockSymbol = entry.getKey(); Quote stockQuote = entry.getValue().quote; // 这里可以将Quote对象存入ArrayList // yourQuoteList.add(stockQuote); // 示例打印数据 System.out.println("股票代码: " + stockSymbol); System.out.println("最新价格: " + stockQuote.latestPrice); System.out.println("市值: " + stockQuote.marketCap); } }, error -> { // 处理请求错误 error.printStackTrace(); });
补充说明
- Gson会自动将JSON的键值对结构转换成Java的
HashMap,不需要额外配置,只要你的实体类字段和JSON字段名称一致(或者用@SerializedName指定映射关系,如果字段名不同的话)。 - 如果不需要保留股票代码和Quote的对应关系,直接遍历Map把所有Quote对象存入
ArrayList<Quote>即可,满足你习惯的数组式存储需求。
内容的提问来源于stack exchange,提问作者호진차
相关产品推荐
相关产品推荐

