2016-10-26 37 views
-1

我的界面看起来是这样的:如何使用retrofit2.0获取JSONArray数据?

public interface newArtsApi { 

    @GET("art/get_all_arts?page=1") 
    Call<List<ArtsPagination>> getMovies(@Query("index") int index);} 

另一个ServiceGenerator类看起来是这样的:

public class ServiceGenerator { 

    public static <S> S createService(Class<S> serviceClass) { 

     OkHttpClient httpClient=new OkHttpClient.Builder() 
       .connectTimeout(30, TimeUnit.SECONDS) 
       .readTimeout(30, TimeUnit.SECONDS) 
       .writeTimeout(30, TimeUnit.SECONDS) 
       .build(); 

     GsonBuilder gson = new GsonBuilder(); 
     gson.registerTypeAdapter(String.class, new StringDesirializer()); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://...../clients/....../api/v1/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(httpClient).build(); 

     return retrofit.create(serviceClass); 

    } 
} 

我想这种类型的使用改造2.0数据,jsonarry_data

JSONARRAY_DATA

但我解析这种类型的数据时出错。

+0

得到错误这样的..从上面的预期BEGIN_ARRAY代码...响应错误但BEGIN_OBJECT位于第1行第2列路径$ – alias26

+0

基本上错误是说你的JSON正在返回一个对象,你的API中你已经规定,它应该得到ArtsPagination的列表,您发布它返回一个单一对象JSONARRAY_DATA形象。 – Rafael

+0

所以u能详细解释一下,我怎样才能得到它...在那里我做出改变..? – alias26

回答

0

ApiInterface apiService = ApiClient.getClient()创建(ApiInterface.class)。

Call<MoviesResponse> call = apiService.getTopRatedMovies(API_KEY); 
    call.enqueue(new Callback<MoviesResponse>() { 
     @Override 
     public void onResponse(Call<MoviesResponse> call, Response<MoviesResponse> response) { 
      int statusCode = response.code(); 

      // Log.w("ResponseCode ",response.body().getResults()+""); 
      List<Movie> movies = response.body().getResults(); 
      recyclerView.setAdapter(new MoviesAdapter(movies, R.layout.list_item_movie, getApplicationContext())); 
     } 

     @Override 
     public void onFailure(Call<MoviesResponse> call, Throwable t) { 
      // Log error here since request failed 
      Log.e(TAG, t.toString()); 
     } 
    }); 
0

如果你想收到ArtsPagination的列表,你的代码是确定的问题是在服务器端,因为它的反应是不是在一个列表来。如果你想获得只有一个对象,你需要改变这种在界面上:

Call<ArtsPagination> getMovies(@Query("index") int index); 

改变这一点,你还需要更新您的onResponseonFailure方法来处理响应作为一个单独的对象。

+0

是的,我做到了,但我没有得到列表[]数据.. – alias26