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

如何在Java中从REST API获取JSON数组(Retrofit+RxJava)

修改步骤以获取Cosmetics数组

1. 更新Retrofit服务接口

首先修改CosmeticsService接口中对应搜索方法的返回类型,从单个Cosmetic改为List<Cosmetic>(或Cosmetic[],List更灵活):

public interface CosmeticsService {
    // 原方法:Single<Cosmetic> getByName(@Path("field") String query);
    // 修改后:
    Single<List<Cosmetic>> getByName(@Path("field") String query);
}

2. 调整请求调用与结果处理

修改调用代码中的结果存储、订阅逻辑,适配数组/列表的返回:

// 用List存储结果,替代单个Cosmetic的数组
final List<Cosmetic> cosmeticResult = new ArrayList<>();
final String[] result = {""}; // 保留原有标记变量,用于结束等待循环

retrofit = new Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build();

service = retrofit.create(CosmeticsService.class);

// 现在调用返回的是Single<List<Cosmetic>>
Single<List<Cosmetic>> callSync = service.getByName(query);

CompositeDisposable compositeDisposable = new CompositeDisposable();
callSync.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorReturn(throwable -> Collections.emptyList()) // 错误时返回空列表
        .subscribe(new SingleObserver<List<Cosmetic>>() {
            @Override
            public void onSubscribe(Disposable d) {
                compositeDisposable.add(d);
            }

            @Override
            public void onSuccess(List<Cosmetic> cosmetics) {
                System.out.println("API返回了" + cosmetics.size() + "条数据");
                cosmeticResult.addAll(cosmetics);
                // 更新标记变量,结束while循环
                result[0] = cosmetics.isEmpty() ? "empty" : cosmetics.get(0).getCode();
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
                result[0] = "error"; // 出错时强制更新标记,避免无限循环
            }
        });

// 保留等待逻辑(注意:这种阻塞主线程的方式在Android中易引发ANR,建议改用异步回调)
while (result[0].equals("")) {}

return cosmeticResult;

可选:用数组替代List

若偏好数组类型,修改如下:

  • 服务接口改为:Single<Cosmetic[]> getByName(@Path("field") String query);
  • 结果存储:Cosmetic[] cosmeticResult = new Cosmetic[0];
  • 订阅的onSuccess方法:
@Override
public void onSuccess(Cosmetic[] cosmetics) {
    System.out.println("API返回了" + cosmetics.length + "条数据");
    cosmeticResult = cosmetics;
    result[0] = cosmetics.length > 0 ? cosmetics[0].getCode() : "empty";
}

关键说明

  • 你的Cosmetic POJO类无需修改,Gson会自动将JSON数组解析为List或数组类型
  • 原代码中的while循环会阻塞主线程,在Android环境下不推荐使用,建议改用异步回调、LiveData或RxJava链式调用处理结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:55:21