【问题标题】:Retrofit2 java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $Retrofit2 java.lang.IllegalStateException:预期 BEGIN_ARRAY 但在第 1 行第 2 列路径 $ BEGIN_OBJECT
【发布时间】:2020-10-22 19:47:37
【问题描述】:

我知道这不是第一次有人问到这个问题,但是使用 Retrofit2 我找不到解决问题的正确方法。我正在尝试通过我的 API 获取电影列表,但应用程序抛出此错误:

预期为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

方法:

   private void getPopularData() {
        Retrofit retrofit = RetrofitClient.getRetrofitInstance();
        MovieApi api = retrofit.create(MovieApi.class);
        Call<List<Video>> call = api.getPopularMovies(Config.API_KEY);
        call.enqueue(new Callback<List<Video>>() {
            @Override
            public void onResponse(Call<List<Video>> call, retrofit2.Response<List<Video>> response) {
                if (response.code() == 200){
                    for (int i = 0; i < response.body().size(); i++){
                        Video video = response.body().get(i);
                        CommonModels models =new CommonModels();
                        models.setImageUrl(video.getThumbnailUrl());
                        models.setTitle(video.getTitle());
                        models.setQuality(video.getVideoQuality());
                        models.setReleaseDate(video.getRelease());
                        models.setImdb_rating(video.getImdb_rating());

                        models.setId(video.getVideosId());
                        list.add(models);
                    }

                    mAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFailure(Call<List<Video>> call, Throwable t) {
                Log.e("ERROR", " "+t);
              
            }
        });

    }

界面:

public interface MovieApi {
    
    @GET("mostpopularmovies")
    Call<List<Video>> getPopularMovies(@Query("API-KEY") String apiKey);
}

这是我在网络浏览器上尝试时加载的响应正文:

{"mostpopularmovies":[{"title":"Cyborgs Amongst Us","release":"2017-06-27","total_view":"103"},{"title":"Bad Nun: Deadly Vows","release":"2020-08-18","total_view":"81"},{"title":"Greyhound","release":"2020-07-10","total_view":"58"},{"title":"The Boys","release":"2019-07-25","total_view":"56"},{"title":"Emily in Paris","release":"2020-10-02","total_view":"25"},{"title":"Enola Holmes","release":"2020-09-23","total_view":"15"},{"title":"The Owners","release":"2020-08-27","total_view":"5"}]}

感谢任何帮助

编辑:

我的视频课:

public class Video {

    @SerializedName("videos_id")
    @Expose
    private String videosId;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("slug")
    @Expose
    private String slug;
    @SerializedName("release")
    @Expose
    private String release;
    @SerializedName("is_tvseries")
    @Expose
    private String isTvseries;
    @SerializedName("is_paid")
    @Expose
    private String isPaid;
    @SerializedName("runtime")
    @Expose
    private String runtime;
    @SerializedName("video_quality")
    @Expose
    private String videoQuality;
    @SerializedName("thumbnail_url")
    @Expose
    private String thumbnailUrl;
    @SerializedName("poster_url")
    @Expose
    private String posterUrl;
    @SerializedName("imdb_rating")
    @Expose
    private String imdb_rating;

    public String getVideosId() {
        return videosId;
    }

    public void setVideosId(String videosId) {
        this.videosId = videosId;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getSlug() {
        return slug;
    }

    public void setSlug(String slug) {
        this.slug = slug;
    }

    public String getRelease() {
        return release;
    }

    public void setRelease(String release) {
        this.release = release;
    }

    public String getIsTvseries() {
        return isTvseries;
    }

    public void setIsTvseries(String isTvseries) {
        this.isTvseries = isTvseries;
    }

    public String getIsPaid() {
        return isPaid;
    }

    public void setIsPaid(String isPaid) {
        this.isPaid = isPaid;
    }

    public String getRuntime() {
        return runtime;
    }

    public void setRuntime(String runtime) {
        this.runtime = runtime;
    }

    public String getVideoQuality() {
        return videoQuality;
    }

    public void setVideoQuality(String videoQuality) {
        this.videoQuality = videoQuality;
    }

    public String getThumbnailUrl() {
        return thumbnailUrl;
    }

    public void setThumbnailUrl(String thumbnailUrl) {
        this.thumbnailUrl = thumbnailUrl;
    }

    public String getPosterUrl() {
        return posterUrl;
    }

    public void setPosterUrl(String posterUrl) {
        this.posterUrl = posterUrl;
    }

    public String getImdb_rating() {
        return imdb_rating;
    }

    public void setImdb_rating(String imdb_rating) {
        this.imdb_rating = imdb_rating;
    }

}

【问题讨论】:

  • 如果您看到响应正文,它是一个对象{}。正如你的错误所说,你需要一个Array,所以我想你需要进入数组[{"title":... }]
  • 您的响应是一个包含电影列表的对象。您的模型应该是这样的:link
  • 分享你的视频课程
  • @PriyankaRajput 请检查我的编辑。

标签: java android retrofit2


【解决方案1】:

您可以制作另一个模型类,例如,

class MovieListResponse {
    public List<Movie> mostpopularmovies;
}

public interface MovieApi {

    @GET("mostpopularmovies")
    Call<MovieListResponse> getPopularMovies(@Query("API-KEY") String apiKey);
}

【讨论】:

    【解决方案2】:

    根据您的共享回复,您将获得一个数组中的视频列表。所以你需要在访问列表之前先得到它。

    public class MostPopularMovies{
    
    @SerializedName("mostpopularmovies")
    @Expose
    private List<Video> mostpopularmovies = null;
    
    public List<Video> getMostpopularmovies() {
        return mostpopularmovies;
    }
    
    public void setMostpopularmovies(List<Video> mostpopularmovies) {
        this.mostpopularmovies = mostpopularmovies;
    }
    
    }
    

    你还需要修改你的代码如下

    public interface MovieApi {
    
    @GET("mostpopularmovies")
    Call<MostPopularMovies> getPopularMovies(@Query("API-KEY") String apiKey);
    }
    

    您需要按此更新 getPopularData 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 2020-01-29
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多