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

如何使用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,提问作者호진차

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:10:07