当前位置: 首页 > 知识库问答 >
问题:

如何使用retrofit2和RXJava2获取JSONArray

薛宏壮
2023-03-14

我使用Reformation2和RxJava2从服务器获取数据。我有以下格式的回复:

 {
   "product_data": [
    {
        "product_name": "Pi-Pi jod kar ye Notebook li hai",
        "product_price": "249.00",
        "category_id": "9",
        "product_id": "125",
        "product_photo": "1574935198_1.jpg"
    },
    {
        "product_name": "Tere Jesa year kaha kaha esa yarana",
        "product_price": "249.00",
        "category_id": "9",
        "product_id": "128",
         "product_photo": "1574935455_1.jpg"
     }
    ]
   } 

我得到以下异常:

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $.

ApiService.class

public interface ApiService {

@GET("general_cat_api")
Observable<List<HomeGeneralModel>> getData();

}

RetrofitClient.class

public class RetrofitClient {

private static Retrofit retrofit = null;

public static Retrofit getInstance(){


    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(22, TimeUnit.SECONDS)
            .readTimeout(22, TimeUnit.SECONDS)
            .writeTimeout(22, TimeUnit.SECONDS)
            .build();

    if(retrofit == null)
        retrofit = new Retrofit.Builder()
                .baseUrl("http://aamku.com/api/")
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build();

    return retrofit;

}

private RetrofitClient(){

  }
}

现在我正在使用如下的一些东西来获取数据:

private void getData(){

    Retrofit retrofit = RetrofitClient.getInstance();
    ApiService myApi = retrofit.create(ApiService.class);

    myApi.getData().subscribeOn(Schedulers.io())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribe(new Observer<List<MenuModel>>() {
                       @Override
                       public void onSubscribe(Disposable d) {

                       }

                       @Override
                       public void onNext(List<MenuModel> menuModels) {

                           if(menuModels.size() > 0){

                               menuProg.setVisibility(View.INVISIBLE);
                               list.addAll(menuModels);

                               adapter = new MenuAdapter(list,MainActivity.this);
                               menuRecycler.setAdapter(adapter);
                           }
                       }

                       @Override
                       public void onError(Throwable e) {

                           menuProg.setVisibility(View.INVISIBLE);
                           Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_SHORT).show();
                       }

                       @Override
                       public void onComplete() {

                       }
                   });
}

有人请让我知道为什么我得到这个exception.Any帮助将不胜感激。

谢谢

共有1个答案

彭雨华
2023-03-14

您的回复格式在这里是错误的

Observable<List<HomeGeneralModel>> getData();

由于您正在响应一个json对象,因此您不需要List。直接在可观察中使用HomeGeneralModel

您的product_data列表应该在HomeGeneral模型中

应该是这样的

  Observable<HomeGeneralModel> getData();
 类似资料:
  • 我有一个API,我需要从标头中提取信息并进行另一次调用。我已经尝试了许多方法,但似乎无法仅获取标头。没有其他响应。 我尝试过让它返回各种响应对象,例如okhttp3标头,Retrofit标头,HttpHeaders等,但首先获得EOF。 任何人都可以告诉我我需要如何构建我的api调用来获取标头吗?

  • 可观察的如下所示。

  • 我试图用相同的观察者观察两个请求。我的: 我的请求是使用Reformation 2构建的登录请求: 现在我想启动2个或更多请求并在中逐个检查响应,当检查最后一个请求时,使用我的执行。有人能帮我吗? 提前致谢。

  • 我使用REST API查询Person对象列表。最大限制是100人响应。我需要把所有的人都叫来,总数不详。第一个响应中有一个名为“next”的字段,包含下一页的url。我需要使用rxjava/rxandroid和referfit链接这些调用,直到最后一个响应有一个空的“next”字段。由于“Next”字段包含分页url,所有后续调用都将具有与第一个不同的url。做这件事最方便的方法是什么?

  • 在RXJava1中,有CompositeSubscription,但在RxJava2中没有,在RxJava2中有CompositeDisable。我如何在RXJava2中使用CompositeDisposable或Disposable?

  • 我最近才开始使用Registfit+Gson,尽管我四处寻找解决问题的答案,并尝试了几种解决方案,但似乎没有任何效果,反而导致: 我发出请求的片段代码... 以防万一有人感兴趣... 我理解错误消息,我只是想弄清楚如何让Gson期望JSONArray。我肯定我的错误是显而易见的,但我没有看到或理解它。提前感谢您的帮助!