如何在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"; }
关键说明
- 你的
CosmeticPOJO类无需修改,Gson会自动将JSON数组解析为List或数组类型 - 原代码中的
while循环会阻塞主线程,在Android环境下不推荐使用,建议改用异步回调、LiveData或RxJava链式调用处理结果
内容的提问来源于stack exchange,提问作者sempre_em_pe
相关产品推荐
相关产品推荐

