0

我正在使用 Retrofit2 向 Google Books API 提出请求并使用 GSON 转换器,但出现错误

ErrorExpected BEGIN_ARRAY 但在第 1 行第 2 列路径 $ BEGIN_OBJECT

到 JSON 的 API URL

这是我的

图书服务.java

public class BookService{

    private static final String BASE_URL = "https://www.googleapis.com/";
    private BookApiService mApiService;
    private BookCallback mListener;

    public BookService(BookCallback listener){
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(BASE_URL)
                .build();

        mApiService = retrofit.create(BookApiService.class);

        mListener = listener;
    }



    public void getBooks(String query){
        final ApiResponse apiResponse = new ApiResponse();
        Call<List<Book>> call = mApiService.getBooks(query);
        call.enqueue(new Callback<List<Book>>() {
            @Override
            public void onResponse(Call<List<Book>> call, Response<List<Book>> response) {
                apiResponse.setBooks(response.body());
                mListener.notifyDataReceived(apiResponse);
            }

            @Override
            public void onFailure(Call<List<Book>> call, Throwable t) {
                apiResponse.setError(t);
                mListener.notifyDataReceived(apiResponse);
            }
        });
    }

    public interface BookCallback{
        void notifyDataReceived(ApiResponse apiResponse);
    }
}

和我的界面

BookApiService.java

public interface BookApiService {

    @GET("/books/v1/volumes")
    Call<List<Book>> getBooks(@Query("q") String query);
}

然后从实现 BookCallback的MainActivity.java发出请求

public class MainActivity extends AppCompatActivity implements BookService.BookCallback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main)
        new BookService(this).getBooks("android");
    }
}
4

2 回答 2

2

您的响应不是数组。它是一个包含数组的对象。

要解决此问题,您必须创建其他响应类,例如BookResponse

BookResponse.java

public class BookResponse{
      @SerializedName("kind")
      private Sting kind;
      @SerializedName("totalItems")
      private Int totalItems;
      @SerializedName("items")
      private List<Book> items;
}

像这样改变你的界面

public interface BookApiService {

    @GET("/books/v1/volumes")
    Call<BookResponse> getBooks(@Query("q") String query);
}
于 2019-08-19T14:05:00.883 回答
0

您得到的响应不是 Books 数组,而是一个对象,它可能是一个包含书籍数组的响应。那么错误的含义是:您的 JsonResponse 不是以开头,[]而是以{}

于 2019-08-19T14:01:04.203 回答